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

如何直接对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:36:04