You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:04:29