【解析メモ】[python]pandas.Dataframe.resampleで日次データを週と月に集計
今日は解析メモです。普段の業務ではpythonを使うことが多いので、pythonでハマった箇所をメインに次回への置き手紙としてメモっときます。
■ data --> アメダス東京の2019年の日平均気温
せっかくなので気象予報士っぽく気象データでやりましょう。気象庁HPからアメダス東京の2019年の日平均気温のデータをダウンロードしてきました。
import pandas as pd
# アメダス東京の2019年の日別平均気温
df=pd.read_csv("tokyo_tave_2019.csv",parse_dates=[0],index_col=0)
print(df)
# 出力結果
tave
Date
2019-01-01 5.3
2019-01-02 6.2
2019-01-03 4.9
2019-01-04 5.1
2019-01-05 7.4
:
2019-12-27 8.7
2019-12-28 6.8
2019-12-29 7.0
2019-12-30 6.7
2019-12-31 8.2
# 時系列
df.plot(figsize=(9,4))
時系列図を描くと↓のような感じです。梅雨が長くて7月後半まで気温が上がり切っていないですね。
■ pandas.Dataframe.resampleの注意点
このデータを週や月で集計したいので、pandas.Dataframe.resampleで変換してみましょう。利用の際の注意点をまとめると以下のような感じです。
・デフォルトはその日を最終日とした前1週間の集計になる。
・その日を開始日にした後ろ7日の値を取りたければ、 closed=“left”,label=“left”を入れる。
(※ただしデフォルトと集計期間が変わるので要注意。
これにより月次は意味不明になるので使用不可。)
■ 具体例:週の集計
df.resample("W")
週次で集計したい場合はdf.resample("W")を使います。そうすると月~日の範囲を最後の日曜日の日付で集計してくれます。曜日が分かりやすいように2019年12月のカレンダーを貼っておきます。
df.resample("W").mean().tail()
# 出力
tave.
Date
2019-12-08 8.857143 # 12/2 - 12/8
2019-12-15 9.371429 # 12/9 - 12/15
2019-12-22 8.800000 # 12/16 - 12/22
2019-12-29 7.314286 # 12/23 - 12/29
2020-01-05 7.450000 # 12/30 - 1/5
週次に集計されました。ただ左のインデックスの日付が最終日なのがイマイチです。
df.resample("W", closed="left", label="left")
それを解決するために、closed=“left”,label=“left” を両方付けてみましょう。すると日~月集計で日付は最初の日曜日になります。これは結構頻繁に使う集計方法です。※ただし先ほどと集計週が違うことに注意。
df.resample("W",closed="left",label="left").mean().tail()
# 出力
tave
Date
2019-12-01 8.857143 # 12/1 - 12/7
2019-12-08 9.185714 # 12/8 - 12/14
2019-12-15 9.071429 # 12/15 - 12/21
2019-12-22 7.285714 # 12/22 - 12/28
2019-12-29 7.300000 # 12/29 - 1/5
df.resample("W-MON", closed="left", label="left")
月~日集計で日付を最初の月曜日にしたい場合、"W-MON"にして、closed=“left”,label=“left” を両方付けてみましょう。これが一番使っているような気がします。
df.resample("W-MON",closed="left",label="left").mean().tail()
# 出力
tave
Date
2019-12-02 8.857143
2019-12-09 9.371429
2019-12-16 8.800000
2019-12-23 7.314286
2019-12-30 7.450000
■ 具体例:月の集計
df.resample("M")
月の値を平均しようとした場合、集計期間を"M"にすると月別に集計してくれます。ただしインデックスが月末日になることに要注意です。
df.resample("M").mean().tail()
# 出力
tave
Date
2019-08-31 28.396774
2019-09-30 25.060000
2019-10-31 19.425806
2019-11-30 13.100000
2019-12-31 8.474194
df.resample("M",closed="left", label="left")
週次ではこれでうまくいきましたが、月次では絶対に使ってはダメです。前月の最終日からその月の最終日1日前までを集計して前月の最終日の日付をつける、という誰しも望まない形で集計してくれやがります。。。
df.resample("M",closed="left",label="left").mean().tail()
# 出力
tave
Date
2019-08-31 25.130000
2019-09-30 19.696774
2019-10-31 13.416667
2019-11-30 8.445161
2019-12-31 8.200000
■ とりあえずこれだけ覚えとく
色々ありましたが、とりあえずこれだけ覚えとくのは以下です。
・週集計(日曜始まり)
⇒ df.resample("W",closed="left",label="left")
・週集計(月曜始まり)
⇒ df.resample("W-MON",closed="left",label="left")
・月集計
⇒ df.resample("M") ※ラベルは月末
pythonは関数が便利なので、コードが短くても色々なことができますが、関数のオプションにハマると予想外の結果になるので注意が必要です。
この記事が気に入ったらサポートをしてみませんか?