Python中含NaN时间序列的滑动平均计算(需保留窗口计数规则)
Pandas默认
rolling().mean()的运行逻辑拆解 - 窗口跨度计数规则:传入整数型window参数时,默认严格按连续数据行计数,即设置window=5时,每个计算窗口必然覆盖连续5行数据,哪怕窗口内存在NaN值,这些NaN所在的行也会被计入窗口总跨度,这部分逻辑和你的需求是完全一致的。
- 内置均值计算的隐藏规则:默认min_periods参数取值和window值绑定,即窗口内需要有等于窗口长度的非NaN有效观测值,才会输出计算结果;只要窗口内存在任意数量的NaN,有效观测数达不到默认要求,整个窗口的输出结果就会返回NaN。这是你调用
rolling(5).mean()得到不符合预期结果的核心原因。
匹配计算规则的正确实现方案
- 调整滚动窗口的
min_periods参数即可完全适配需求。将原调用代码从series.rolling(5).mean()修改为series.rolling(5, min_periods=1).mean()。 - 参数匹配说明:
- 窗口的长度计数逻辑不受min_periods影响,依然会严格截取连续5行作为计算范围,窗口内的NaN行依然占用窗口位置,满足你对窗口总跨度的计数要求。
- 计算均值时,方法会自动排除所有NaN的数值贡献,只要窗口内存在至少1个非NaN的有效数值,就基于窗口内全部有效数值计算算术平均,不会因为窗口内存在NaN就返回空值。
- 额外校验提示:如果处理的是带时间索引的序列,不要将window参数设置为时间长度类的字符串(如
'5H'、'5D'),保持window为整数5,即可确保窗口是按固定行数计数,而非按实际时间范围截取。
简单验证示例:对于序列
[1, 2, np.nan, 4, 5, 6]
- 默认
rolling(5).mean()对第一个计算窗口[1,2,np.nan,4,5]的输出为NaN,因为窗口内有效观测数为4,达不到默认要求的5个。- 调整为
rolling(5, min_periods=1).mean()后,该窗口的输出为3,即窗口内有效数值1、2、4、5的算术平均值,完全匹配规则要求。
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

