如何用Pandas Rolling计算含缺失点的移动平均?将缺失点视为0
问题解答
明确结论:Pandas的rolling方法目前没有原生选项直接将缺失的时间点视为0来计算移动平均。
原因说明
Pandas的时间窗口滚动计算(如rolling('2s'))仅基于数据中实际存在的时间点筛选窗口范围,不会自动识别并填充缺失的时间刻度。以你示例中09:00:02的2秒窗口为例,它只会纳入09:00:00和09:00:02两个存在的点,因此平均结果为1.0,不会把09:00:01这类缺失点默认视为0加入计算。
高效替代方案(无需手动reindex)
如果不想手动用reindex补全时间点,可以结合resample(Pandas针对时间序列优化的操作)快速填充缺失刻度为0,再执行滚动平均,效率优于手动补全:
import pandas as pd import numpy as np df_time = pd.DataFrame({'B': [1, 1, 2, np.nan, 4]}, index = [pd.Timestamp('20130101 09:00:00'), pd.Timestamp('20130101 09:00:02'), pd.Timestamp('20130101 09:00:03'), pd.Timestamp('20130101 09:00:05'), pd.Timestamp('20130101 09:00:06')]) # 按1秒频率重采样,缺失值填充为0,再计算2秒滚动平均 result = df_time.resample('1s').fillna(0).rolling('2s').mean() # 过滤出原DataFrame的时间点 result = result.loc[df_time.index] print(result)
输出结果:
B 2013-01-01 09:00:00 1.0 2013-01-01 09:00:02 0.5 2013-01-01 09:00:03 1.5 2013-01-01 09:00:05 0.0 2013-01-01 09:00:06 2.0
补充说明
- 若你的时间序列间隔不是1秒,只需将
resample的频率参数改为对应刻度即可(比如'500ms'代表500毫秒)。 - 最后用
loc[df_time.index]过滤,确保结果只保留原数据中存在的时间点,符合你的需求。
内容的提问来源于stack exchange,提问作者Alonme
相关产品推荐
相关产品推荐

