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

Pandas中DatetimeIndex滚动窗口如何实现首尾环绕计算

环形滚动计算实现方案

问题说明

现有索引为日频DatetimeIndex的DataFrame,共365行对应当年全年每日数据。使用Pandas原生rolling计算滚动统计值时,前窗口大小-1个位置会默认返回NaN,需要实现首尾环绕的环形滚动效果:

  • 窗口大小为3时,1月1日的计算值为上年12月30日、12月31日、1月1日三个值的聚合结果
  • 窗口大小为3时,1月2日的计算值为上年12月31日、1月1日、1月2日三个值的聚合结果

Pandas的rolling方法无原生参数支持该环形逻辑,默认行为复现代码如下:

import numpy as np
import pandas as pd

fake_data = pd.DataFrame(index=pd.date_range('2022-1-1', '2022-12-31', freq='D'),
                         data=np.random.random(365))
# 默认滚动,前2行返回NaN
rolling_fake_data = fake_data.rolling(3).sum()

实现代码

核心逻辑:将原数据末尾窗口大小-1行拼接至原数据头部,执行常规滚动计算后,截取与原数据等长的尾部结果即可,无额外依赖。

window = 3
# 环形滚动求和
circular_rolling_result = pd.concat([
    fake_data.iloc[-(window-1):],  # 取末尾window-1行补到头部
    fake_data
]).rolling(window).sum().iloc[window-1:]  # 滚动后跳过拼接引入的多余行

逻辑说明

以窗口=3为例:

  1. 拼接后的数据前2行为2022年12月30日、12月31日的数据,后续接原2022年全年365行数据
  2. 执行rolling(3).sum()时,第一个有效计算值正好对应原数据1月1日位置,值为12月30日、12月31日、1月1日三数之和,完全符合需求
  3. 最终截取的结果长度为365行,索引与原DataFrame完全一致,可直接对齐使用
  4. 若需要计算其他滚动统计量(均值、标准差、最大值等),仅需将.sum()替换为对应聚合方法即可,例如.mean()计算环形滚动均值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:54:31