Pythonで配列内の月末日を抽出するコード

Python Pandasで時系列データを扱う際、月末ベースで分析したいことは多々ある。 asfreqやresampleを使うことが多いが、これらはカレンダーベースの月末日を返したり、集約関数だったりで配列内の月末最終日を直接取得できない。

適切にindexが設定されているPandasデータフレームに対し下記コードを用いれば、直接配列内の月末値を取得できる。

def getEndOfMonth(df):
    df=df.sort_index()
    return df[(pd.Series(df.index.month.values).diff(-1) != 0).values]

解説
df.index.month.values:データフレームの月の数値をもとに計算。diff(-1)で月の差分(通常-1 or 年跨ぎは11 or 最終行はNan)を取得。diffの引数が−1なのは、デフォルト値の0だと翌月初日に数値が入ってしまうため。-1, 11, Nanとなっている行は当データフレームにおいては月内最終日のため、0でない値の行は全てTrueとして抽出すると月末日のみ取り出せる。

Date month diff flag
2020-12-29 12 0 False
2020-12-30 12 11 True
2021-01-04 1 0 False
2021-01-05 1 0 False
2021-01-06 1 nan True