You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中实现每月重置的滚动最大值?解决rolling('M')非固定频率报错问题

解决Pandas中非固定频率序列的每月重置滚动最大值问题

嘿,这个问题我之前也踩过坑!当你的时间序列索引是非固定频率的时候(比如数据不是每天都有,或者间隔不规则),rolling('M')确实会抛出ValueError: is a non-fixed frequency的错误——因为Pandas的时间滚动窗口要求索引是固定频率的DatetimeIndex(比如严格每日、每小时间隔的序列)。

不过你提到的pd.Grouper()正是解决这个问题的完美工具,核心思路很简单:按月份分组,然后在每个组内计算累积最大值,这样就能自动实现"到当月当前日期为止的最大值,下月自动重置"的需求。

具体实现步骤

  1. 确保日期列是Datetime类型(如果还不是的话):

    # 假设你的日期列名为'date',先转成Datetime类型
    rtl['date'] = pd.to_datetime(rtl['date'])
    
  2. 按月份分组计算累积最大值:

    • 如果你的日期列是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()
      

为什么这个方法有效?

  • pd.Grouper(freq='M')会自动把所有属于同一个月份的行归为一组,不管你的数据频率有多不规则(哪怕某天没数据,或者一天有多条记录)。
  • cummax()函数会在每个分组内,从第一行到当前行逐步计算最大值——这正好就是你要的"到当月当前日期为止的滚动最大值"。当进入下一个月份的分组时,计算会自动重置,完全符合你的需求。

举个实际例子

假设你的数据长这样:

dateactual_system_demand
2023-01-05100
2023-01-12150
2023-01-20120
2023-02-0390
2023-02-10110

运行代码后,to date monthly max列的结果会是:
100, 150, 150, 90, 110
完全符合"每月内滚动取最大,下月重置"的要求。

内容的提问来源于stack exchange,提问作者Andrew Johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 09:52:45