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

Pandas rolling函数整数窗口初始NaN,偏移窗口却无?如何自动返回NaN?

Pandas rolling时间窗口初始值非NaN的解决办法

当使用Pandas的rolling函数时,传入整数窗口参数(如3),在数据量未达到窗口大小前,结果会返回NaN;但传入等效的时间偏移参数(如'3D')时,却会直接计算当前已有数据的总和,不会返回NaN,示例如下:

import pandas as pd
import numpy as np

df = pd.DataFrame(index=pd.date_range('1/1/2020','1/31/2020',freq='D'),data={'A':np.arange(1,32,1)})

df['intWindow'] = df['A'].rolling(3).sum()

df['offsetWindow'] = df['A'].rolling('3D').sum()

print(df.head())

输出结果:

A  intWindow  offsetWindow
2020-01-01  1        NaN           1.0
2020-01-02  2        NaN           3.0
2020-01-03  3        6.0           6.0
2020-01-04  4        9.0           9.0
2020-01-05  5       12.0          12.0

差异原因

这不是计算不准确,而是两种窗口的逻辑不同:

  • 整数窗口是固定观测数量的窗口:必须凑够指定数量的样本才会计算,不足则返回NaN。
  • 时间偏移窗口是基于时间范围的窗口:只要当前时间往前推偏移量范围内存在数据,就会计算这些数据的聚合值,不管数据数量多少。

解决方案:使用min_periods参数

Pandas没有直接让时间窗口返回初始NaN的开关,但可以通过min_periods参数实现需求。将min_periods设置为时间窗口对应的预期样本数量(比如每日频率下,'3D'对应3个样本),这样只有当窗口内至少有指定数量的数据时才会计算,否则返回NaN:

df['offsetWindow_fixed'] = df['A'].rolling('3D', min_periods=3).sum()
print(df.head())

输出结果:

A  intWindow  offsetWindow  offsetWindow_fixed
2020-01-01  1        NaN           1.0                 NaN
2020-01-02  2        NaN           3.0                 NaN
2020-01-03  3        6.0           6.0                 6.0
2020-01-04  4        9.0           9.0                 9.0
2020-01-05  5       12.0          12.0                12.0

如果你的时间序列频率不固定,无法提前确定预期样本数,可以先通过整数窗口标记非NaN的位置,再将时间窗口对应位置外的值设为NaN,不过这种场景下min_periods依然是更简洁的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:58:23