如何在Pandas中实现每月重置的滚动最大值?解决rolling('M')非固定频率报错问题
解决Pandas中非固定频率序列的每月重置滚动最大值问题
嘿,这个问题我之前也踩过坑!当你的时间序列索引是非固定频率的时候(比如数据不是每天都有,或者间隔不规则),rolling('M')确实会抛出ValueError: is a non-fixed frequency的错误——因为Pandas的时间滚动窗口要求索引是固定频率的DatetimeIndex(比如严格每日、每小时间隔的序列)。
不过你提到的pd.Grouper()正是解决这个问题的完美工具,核心思路很简单:按月份分组,然后在每个组内计算累积最大值,这样就能自动实现"到当月当前日期为止的最大值,下月自动重置"的需求。
具体实现步骤
确保日期列是Datetime类型(如果还不是的话):
# 假设你的日期列名为'date',先转成Datetime类型 rtl['date'] = pd.to_datetime(rtl['date'])按月份分组计算累积最大值:
- 如果你的日期列是DataFrame的索引:
rtl['to date monthly max'] = rtl.groupby(pd.Grouper(freq='M'))['actual_system_demand'].cummax() - 如果日期列不是索引(比如列名为'date'):
rtl['to date monthly max'] = rtl.groupby(pd.Grouper(key='date', freq='M'))['actual_system_demand'].cummax()
- 如果你的日期列是DataFrame的索引:
为什么这个方法有效?
pd.Grouper(freq='M')会自动把所有属于同一个月份的行归为一组,不管你的数据频率有多不规则(哪怕某天没数据,或者一天有多条记录)。cummax()函数会在每个分组内,从第一行到当前行逐步计算最大值——这正好就是你要的"到当月当前日期为止的滚动最大值"。当进入下一个月份的分组时,计算会自动重置,完全符合你的需求。
举个实际例子
假设你的数据长这样:
| date | actual_system_demand |
|---|---|
| 2023-01-05 | 100 |
| 2023-01-12 | 150 |
| 2023-01-20 | 120 |
| 2023-02-03 | 90 |
| 2023-02-10 | 110 |
运行代码后,to date monthly max列的结果会是:100, 150, 150, 90, 110
完全符合"每月内滚动取最大,下月重置"的要求。
内容的提问来源于stack exchange,提问作者Andrew Johnson
相关产品推荐
相关产品推荐

