大熊猫数据帧中NaN的线性插值基于其两个邻居(上方和下方或左右)

时间:2017-09-19 15:55:32

标签: python pandas dataframe interpolation imputation

我有一个数据框,其中一列浮点值和时间戳作为索引类似于下面。索引中的所有时间戳都按升序排序。

timestamp           value
2014-01-08 08:00:42 1
2014-01-08 08:01:00 NaN
2014-01-08 08:01:12 3
2014-01-08 08:01:52 7
2014-01-08 08:02:02 9

如何在1和3值(即上下值)上“仅”基于线性插值/推算NaN值。数据框很大,可以运行高达2 GB。因此速度对于此操作非常重要

由于

1 个答案:

答案 0 :(得分:2)

修改:您根据索引中的时间戳差异更新了问题,并将这些比例应用于您的DataFrame值。

这是一种粗略的方式,实际上应该很快:

ts = pd.to_datetime(['2014-01-08 08:00:42',
                     '2014-01-08 08:01:00',
                     '2014-01-08 08:01:12',
                     '2014-01-08 08:01:52',
                     '2014-01-08 08:02:02'])

df = pd.DataFrame([1, np.nan, 3, 7, 9], index=ts, columns=['value'])
td = df.index.to_series().diff().dt.total_seconds()
interp = df.value.shift(1) + (df.value.shift(-1) - df.value.shift(1)) \
       * td / (td.shift(-1) + td)

df['value'] = df['value'].fillna(interp)
print(df)
                     value
2014-01-08 08:00:42    1.0
2014-01-08 08:01:00    2.2
2014-01-08 08:01:12    3.0
2014-01-08 08:01:52    7.0
2014-01-08 08:02:02    9.0

在这个例子中,第二个位置的NaN的时间差分别为18个单位和12个单位以上。因此应填写值1 +(3 - 1)*(18 /(18 + 12))。

您也可以简化数学。

另一件事:在回答这个问题时,我问了一个关于计算时间的问题。如果速度对你很重要,@ piRSquared有一个更快的解决方案here