如何直接对pandas Resampler对象执行插值实现不规则时间序列重采样
解决方案
你需要的效果可以通过重索引+插值的逻辑实现,比你当前的拼接去重方案更简洁高效,也符合pandas的API设计逻辑。
核心原理
你之前的写法df.resample("T").mean().interpolate(method="index")不符合预期的原因是:resample("T").mean()会先把每个分钟桶内的数据做聚合,丢失了原始采样点的精确时间信息,插值时只能按整点分钟的间隔计算,无法匹配原始时间差的权重。
最简写法
只输出整点分钟级结果(匹配你给出的预期输出)
import pandas as pd # 你的原始数据 idx = pd.DatetimeIndex(["2021-01-01 00:01:35", "2021-01-01 00:05:01", "2021-01-01 00:08:42"]) df = pd.DataFrame({"a": [1, 2, 3]}, index=idx) # 构造目标整点分钟索引 target_idx = pd.date_range( start=df.index.min().ceil("T"), end=df.index.max().floor("T"), freq="T" ) # 合并原始索引和目标索引后插值,最后筛选出目标索引的行 res = df.reindex(df.index.union(target_idx))\ .interpolate(method="index")\ .reindex(target_idx)
运行后输出的结果和你给出的预期完全一致:
a 2021-01-01 00:02:00 1.121359 2021-01-01 00:03:00 1.412621 2021-01-01 00:04:00 1.703883 2021-01-01 00:05:00 1.995146 2021-01-01 00:06:00 2.266968 2021-01-01 00:07:00 2.538462 2021-01-01 00:08:00 2.809955
保留原始非整点采样点
去掉最后一步筛选目标索引的逻辑即可,得到的结果和你当前的临时方案完全一致:
res = df.reindex(df.index.union(target_idx)).interpolate(method="index")
替代简化写法
你也可以直接复用resample生成的整点索引,不需要手动构造date_range:
resample_idx = df.resample("T").asfreq().index res = df.reindex(df.index.union(resample_idx))\ .interpolate(method="index")\ .reindex(resample_idx) # 不需要保留原始点就加这行,否则去掉
这种方案的性能比concat+排序去重的写法高很多,适合处理大批量数据。
内容的提问来源于stack exchange,提问作者Nerxis
相关产品推荐
相关产品推荐

