pandas 数据帧中基于其两个邻居(上下或左右)的 NaN 的线性插值
Linear interpolation of NaN's in pandas dataframe based on its two neighbors (above & below or left & right)
我有一个数据框,其中有一列浮点值和时间戳作为索引,类似于以下内容。索引中的所有时间戳均按升序排序。
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
如何线性 interpolate/Impute 基于 "only" 1 和 3 值(即高于和低于值)的 NaN 值。数据框很大,可以 运行 达到 2 GB。所以速度对于这个操作很重要
谢谢
编辑:您更新了您的问题以根据索引中的时间戳差异进行插值,将这些比例应用于您的 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 有一个更快的解决方案 如果速度对你来说很重要。
我有一个数据框,其中有一列浮点值和时间戳作为索引,类似于以下内容。索引中的所有时间戳均按升序排序。
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
如何线性 interpolate/Impute 基于 "only" 1 和 3 值(即高于和低于值)的 NaN 值。数据框很大,可以 运行 达到 2 GB。所以速度对于这个操作很重要
谢谢
编辑:您更新了您的问题以根据索引中的时间戳差异进行插值,将这些比例应用于您的 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 有一个更快的解决方案