Pandas技巧:如何按月份分组汇总Datetime索引的DataFrame数据?
按Datetime索引将周度DataFrame汇总为月度数据的解决方法
问题描述
我有一个以日期时间(Datetime)为行索引的小型DataFrame,希望将每周的数据汇总为月度数据,但不知如何按索引分组,数据示例如下:
A B C D Date 2023-01-08 0.0000 0.7075 0.0000 0.000 2023-01-15 0.0000 1.0000 0.0000 0.000 2023-01-22 0.0000 1.0000 0.0000 0.000 2023-01-29 0.0325 0.9300 0.0000 0.025 2023-02-05 0.0250 0.9750 0.0000 0.000 2023-02-12 0.0050 0.5450 0.0000 0.000 2023-02-19 0.0000 0.1800 0.0000 0.000 2023-02-26 0.0000 0.0000 0.0000 0.000 2023-03-05 0.0000 0.0000 0.0000 0.000 2023-03-12 0.0000 0.0000 0.0000 0.000 2023-03-19 0.0000 0.0000 0.0000 0.000 2023-03-26 0.0000 0.4375 0.1875 0.000
解决方法
Pandas提供了两种简洁的方式实现时间序列的月度聚合,前提是你的DataFrame行索引已经是datetime类型(如果不是,先执行df.index = pd.to_datetime(df.index)转换)。
方法1:使用resample方法
resample是Pandas专门为时间序列设计的聚合工具,语法直观:
# 按月度汇总,求和(可替换为mean/max/min等聚合函数) monthly_df = df.resample('M').sum()
- 参数
'M'表示按日历月分组,结果的索引会是每个月的最后一天(如2023-01-31)。 - 替换
sum()为你需要的聚合逻辑,比如求月度平均值用mean(),求最大值用max()。
方法2:使用groupby + Grouper
如果需要更灵活的分组逻辑(比如结合其他字段分组),可以用pd.Grouper:
import pandas as pd # 按月度索引分组并求和 monthly_df = df.groupby(pd.Grouper(freq='M')).sum()
pd.Grouper(freq='M')指定按月度频率分组,效果和resample('M')一致,适合复杂场景。
示例输出
对提供的示例数据执行resample('M').sum()后,结果如下:
A B C D Date 2023-01-31 0.0325 3.6375 0.0000 0.025 2023-02-28 0.0300 1.7000 0.0000 0.000 2023-03-31 0.0000 0.4375 0.1875 0.000
内容的提问来源于stack exchange,提问作者Jim Rutter
相关产品推荐
相关产品推荐

