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

Pandas resample结合interpolate行为异常,求技术解释

Pandas resample后插值异常的原因解释

问题场景与复现

在Python 3.8及更高版本的Pandas中,对带TimedeltaIndex的DataFrame执行resample('1s').interpolate()时,未按预期完成线性插值,仅将首个值向前传播填充。

复现代码

import pandas as pd
data = {'time': pd.to_timedelta([0., 1.1, 2.2, 3.3, 4.4], unit='s'), 'data':[100, 140, 50, 300, 400]}
df1 = pd.DataFrame(data=data).set_index('time')
df2 = df1.resample('1s').interpolate()
print(df1)
print(df2)

输出结果

data
time                        
0 days 00:00:00          100
0 days 00:00:01.100000   140
0 days 00:00:02.200000    50
0 days 00:00:03.300000   300
0 days 00:00:04.400000   400
                  data
time                  
0 days 00:00:00  100.0
0 days 00:00:01  100.0
0 days 00:00:02  100.0
0 days 00:00:03  100.0
0 days 00:00:04  100.0

异常原因分析

核心问题出在resample与interpolate的链式调用逻辑上:

  • resample('1s')会生成整秒间隔的索引(0s、1s、2s、3s、4s),但默认不会保留原数据中非整秒点的数值,仅保留与新索引匹配的点——原数据中只有0s是整秒点,其余1.1s、2.2s等时间点的数值会被丢弃,新索引的其余位置默认填充NaN。
  • 当直接链式调用interpolate()时,由于resample后的结果中只有第一个位置有有效值,后续全为NaN,插值函数无法找到后续的已知参考点,只能执行**向前填充(ffill)**逻辑,导致所有缺失值都被第一个值覆盖。

解决方法

需要先通过asfreq()明确保留resample后的缺失值占位,让插值函数能识别出需要插值的区间,再执行插值:

df2 = df1.resample('1s').asfreq().interpolate()

执行后,整秒点会根据前后原数据的时间点进行线性插值,得到符合预期的结果。

内容的提问来源于stack exchange,提问作者Adam Schulz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:30:39