Pandas .resample()/.asfreq()时间序列前向填充末尾区间问题
优雅解决1小时转15分钟重采样的末尾填充问题
我完全懂你的困扰——手动追加一小时再截掉的做法确实有点“凑活”,咱们来用更简洁的方式搞定这个问题。首先先明确下你的原始数据情况:
import pandas as pd df = pd.DataFrame({'date':pd.date_range('2018-01-01 00:00', '2018-01-01 01:00', freq = '1H'), 'num':5}) df = df.set_index('date')
这个DataFrame的索引只有2018-01-01 00:00和2018-01-01 01:00两个时间点,默认用asfreq('15T', method='ffill')只能填充到01:00,没法覆盖01:15、01:30、01:45这三个你需要的区间。
方案一:用reindex构造完整时间范围
这是最直观的方法——先生成你想要的完整15分钟间隔时间序列,再用原数据对齐填充:
# 生成从起始时间到最后时间+45分钟的15分钟间隔索引 full_time_index = pd.date_range( start=df.index.min(), end=df.index.max() + pd.Timedelta(minutes=45), freq='15T' ) # 重新索引并向前填充 df_resampled = df.reindex(full_time_index, method='ffill')
运行后你会得到从00:00到01:45的所有15分钟区间,每个值都是5,完全不需要额外的删除操作。
方案二:用resample结合pad+扩展时间范围
如果你更习惯用resample,可以先把原数据的索引扩展到目标结束时间,再重采样:
# 把原索引扩展到最后时间+45分钟 extended_df = df.reindex(pd.date_range(df.index.min(), df.index.max() + pd.Timedelta(minutes=45), freq='H')) # 重采样15分钟并向前填充 df_resampled = extended_df.resample('15T').pad()
不过这个方案其实和方案一思路类似,只是多了一步小时级的扩展,方案一更直接。
为什么这两种方法更优雅?
- 完全不需要“先加后删”的冗余操作,逻辑清晰直接
- 可以灵活控制最终的时间范围(比如你要是想填充到
02:00,只需要把minutes=45改成minutes=60就行) - 代码可读性更高,别人一看就知道你是要生成完整的时间序列并填充
内容的提问来源于stack exchange,提问作者elPastor
相关产品推荐
相关产品推荐

