如何对MultiIndex DataFrame进行降粒度重采样(日度转月末)并保留每月最后有效观测值
如何在MultiIndex Pandas DataFrame中提取每月最后一个有效观测值(重采样至月末)
你需要将带有date和groups双索引的日度数据转换为月末频率,同时保留当月最后一个有效日的各组数据,并且将日期标记为当月月末。下面是两种实用的解决方案:
方法一:Unstack + 重采样 + Stack
这种方法适合所有组的有效日期一致的场景,操作步骤清晰直观:
- Unstack分组索引:先把
groups从索引转为列,让date成为唯一的行索引,这样就能直接复用单索引下的asfreq方法:
df_unstacked = df.unstack(level='groups')
- 月末重采样并填充:用
asfreq('M', method='ffill')将日期重采样至月末,同时用当月最后一个有效观测值填充:
df_monthly_unstacked = df_unstacked.asfreq('M', method='ffill')
- 恢复MultiIndex结构:再把
groups重新转为索引,并排序保证结构整洁:
df_monthly = df_monthly_unstacked.stack(level='groups').sort_index()
方法二:分组后单独处理
如果不同组的有效日期可能存在差异(比如某些组在某月的最后有效日和其他组不同),这种方法更灵活,对每个组单独执行重采样逻辑:
df_monthly = df.groupby(level='groups', group_keys=False).apply( lambda x: x.asfreq('M', method='ffill') ).sort_index()
结果验证
运行上述任意一种方法后,你都会得到符合预期的结果:日期被设置为当月月末,对应的值是该月最后一个有效日的各组数据,和你给出的示例输出完全一致。
内容的提问来源于stack exchange,提问作者vpy
相关产品推荐
相关产品推荐

