代码之家  ›  专栏  ›  技术社区  ›  RTM

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

  •  0
  • RTM  · 技术社区  · 7 年前

    我有一个数据帧,其中有一列浮点值和时间戳作为索引,如下所示。索引中的所有时间戳都按升序排序。

    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 回复  |  直到 7 年前
        1
  •  2
  •   Brad Solomon    7 年前

    编辑:您更新了问题,根据索引中的时间戳差异进行插值,将这些比例应用于数据帧值。

    这里有一个粗略的方法,实际上应该相当快:

    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 如果速度对你来说很重要。