如何对含重复时间索引的pandas DataFrame应用滚动均值且保留所有观测值
解决方案
核心逻辑为先按时间t聚合每个时间点所有观测值的总和与计数,再用长度为2的滚动窗口计算窗口内总数值之和除以总观测数,偏移1位后即可得到每个时间点对应的过去2天均值,全程不会丢弃任何原始有效数据。
实现代码
import pandas as pd # 示例数据 df = pd.DataFrame({ 'id': [1,1,1,2,3,3,4,4,4], 't': [1, 2, 3, 2, 1, 2, 2, 3, 4], 'v1':[1, 2, 3, 4, 5, 6, 7, 8, 9] }) # 按时间t聚合每个时间点的v1总和与观测数量 agg_df = df.groupby('t')['v1'].agg(sum_v='sum', count_v='count') # 补全所有连续时间索引,包含最大t+1以覆盖所有预期输出时间点 max_t = df['t'].max() agg_df = agg_df.reindex(range(1, max_t + 2)).sort_index() # 计算2天窗口的滚动总和与总观测数,偏移1位对应目标时间t的过去2天范围 rolling_sum = agg_df['sum_v'].rolling(window=2, min_periods=2).sum().shift(1) rolling_count = agg_df['count_v'].rolling(window=2, min_periods=2).sum().shift(1) # 计算均值,保留3位小数,空值替换为- result = (rolling_sum / rolling_count).round(3).fillna('-').reset_index(name='v2') print(result)
输出结果
| t | v2 |
|---|---|
| 1 | - |
| 2 | - |
| 3 | 4.167 |
| 4 | 5.0 |
| 5 | 6.667 |
如果你的时间列为日期格式,把reindex步骤替换为按天重采样补全连续日期即可适配。
内容的提问来源于stack exchange,提问作者wz1055
相关产品推荐
相关产品推荐

