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
相关产品推荐
相关产品推荐

