如何用按同月同日分组得到的均值dataframe填充时间序列NA缺失值
解决方案
核心问题是df_norm为**(月,日)多级索引**,而补全频率后的原df为单日期索引,二者索引结构不匹配导致无法直接填充。提供两种可直接运行的实现方案:
方案1:复用已计算好的df_norm填充
先给df_norm的索引起明确名称,再通过日期的月、日属性匹配对应均值填充:
# 1. 给df_norm的多级索引命名,方便匹配 df_norm.index.names = ['month', 'day'] # 2. 补全原数据日频 df = df.asfreq('d') # 3. 生成每个日期对应的同期均值序列 fill_vals = df.index.map(lambda x: df_norm.loc[(x.month, x.day), 'Volume']) # 4. 填充缺失值 df['Volume'] = df['Volume'].fillna(fill_vals)
方案2:直接用transform一步生成填充序列
不需要单独存储df_norm,补全日频后直接通过分组转换生成与原df长度完全对齐的同期均值序列,填充更简便:
df = df.asfreq('d') # 按同月同日分组取均值,生成和原df行数完全一致的均值序列 daily_norm = df.groupby([df.index.month, df.index.day])['Volume'].transform('mean') # 直接填充 df['Volume'] = df['Volume'].fillna(daily_norm)
注意事项
如果你的时间范围包含闰年2月29日,且历史数据中没有足够的2月29日样本,可以额外加判断逻辑,把2月29日的填充值替换为2月28日或3月1日的均值即可。
内容的提问来源于stack exchange,提问作者spcol
相关产品推荐
相关产品推荐

