Pandas中resample求均值未计入初始零值的问题及方案问询
解决方案
基于resample的核心思路
Pandas的resample('MS').mean()默认仅计算现有数据点的均值,不会自动将缺失日期视为0。要实现你的需求,核心是用区间内的总和除以整个区间的总天数(或总周期数),等价于把缺失日期的0值纳入计算。
月度均值计算
针对你的示例,代码可按如下方式实现:
# 假设你的时间序列为ts,索引为DatetimeIndex monthly_result = ts.resample('MS').sum() / ts.resample('MS').apply(lambda x: x.index.days_in_month[0])
逻辑说明:
resample('MS').sum():计算每月现有数据的总和(你的案例中是16天×5=80)x.index.days_in_month[0]:获取该月的总天数(2018年3月共31天)- 总和除以总天数,得到包含缺失日期(视为0)的均值(80/31≈2.58)
更简洁的写法:
monthly_result = ts.resample('MS').apply(lambda x: x.sum() / x.index.days_in_month[0])
年度均值计算
若处理年度均值(比如序列始于12月31日的场景),可通过年份总天数计算:
annual_result = ts.resample('AS').apply(lambda x: x.sum() / pd.Period(x.index[0], 'Y').days_in_year)
逻辑说明:
pd.Period(x.index[0], 'Y').days_in_year:自动获取该年份的总天数(闰年366天,平年365天)- 总和除以全年天数,得到包含全年所有日期(缺失视为0)的均值
备选方案(非resample)
如果不想依赖resample,也可通过重新索引填充0后计算均值,但需先生成完整日期序列:
# 生成目标区间的完整日期索引 full_index = pd.date_range(start=ts.index.min().replace(day=1), end=ts.index.max(), freq='D') # 重新索引并填充0,再计算月度均值 ts_full = ts.reindex(full_index, fill_value=0) monthly_result = ts_full.resample('MS').mean()
此方法需手动生成完整索引,不如resample的总和除法方案简洁。
内容的提问来源于stack exchange,提问作者n992
相关产品推荐
相关产品推荐

