Pandas 数据框:使用线性插值重新采样

Posted

技术标签:

【中文标题】Pandas 数据框:使用线性插值重新采样【英文标题】:Pandas data frame: resample with linear interpolation 【发布时间】:2014-10-04 11:48:22 【问题描述】:

我正在尝试获得一种相当基本的重采样方法来处理 pandas 数据框。我的数据框 df 由日期时间条目索引并包含价格

                               price
datetime                            
2000-08-16 09:29:55.755000  7.302786
2000-08-16 09:30:10.642000  7.304059
2000-08-16 09:30:26.598000  7.304435
2000-08-16 09:30:41.372000  7.304314
2000-08-16 09:30:56.718000  7.304334

我想将其缩减为 5 分钟。使用

df.resample(rule='5Min',how='last',closed='left')

在我的数据中以 5 分钟的倍数取最左边的点;类似

df.resample(rule='5Min',how='first',closed='left')

将关闭点移到右侧。 但是,我想采用左右点之间的线性插值,例如如果我的 df 包含两个连续的条目

time t1, price p1
time t2, price p2

t1<t<t2 where t is a multiple of 5min

那么重新采样的数据框应该有条目

time t, price p1+(t-t1)/(t2-t1)*(p2-p1)

【问题讨论】:

有一个similar question yesterday,但没有得到好的答案。 与此同时,其他问题得到了一些更好的答案,例如this one with .interpolate. 【参考方案1】:

尝试创建两个单独的数据框,reset_index 它们(因此它们具有相同的数字索引),fillna 在它们上面,然后对 df1 和 df2 进行数学运算。例如:

df1 = df.resample(rule='5Min',how='last',closed='left').reset_index().fillna(method='ffill')
df2 = df.resample(rule='5Min',how='first',closed='left').reset_index().fillna(method='ffill')

dt = df1.datetime - df2.datetime
px_fld = df1.price + ...

类似的东西应该可以解决问题。

【讨论】:

感谢您的回答。但是,dt = df1.datetime - df2.datetime 则未定义。 你这是什么意思?它是在dt = df1.datetime - df2.datetime 定义的,还是你的意思是别的? 对不起,我的意思是 df1.datetime 给出了一个错误,因为我们使用了 reset_index。但是,只需使用 df1['index'] 就可以完全按照您所说的那样工作。非常感谢! 啊,我明白了。我在想,因为原来的 df 有“日期时间”作为索引名称,它会结转。对此感到抱歉,但很高兴你明白了。 我也需要这样做,但由于答案不完整,我遇到了麻烦。我的尝试是这样的val = df1.value + (df0.timestamp - df1.timestamp) / (df2.timestamp - df1.timestamp) * (df2.value - df1.value)。我看不到 df1.datetime - df2.datetime 的用途。

以上是关于Pandas 数据框:使用线性插值重新采样的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 从重采样中检索添加行的索引

Pandas 使用其他不规则时间列表重新采样和插值不规则时间序列

您如何对重新采样的音频数据进行双三次(或其他非线性)插值?

使用 Pandas 重新采样然后填充原始数据框

Pandas 使用日期时间索引重新排列和插值时间序列

pandas DataFrame 从不规则时间序列索引中重新采样