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 |