线性插入pandas数据帧中的缺失行

时间:2015-12-13 17:10:37

标签: python pandas

我有这个人。数据帧:

               Value         ts  year   JD          check     group_id
0                NaN  950832000  2000   49           NaN      19987
1                NaN  952214400  2000   65           NaN      19987
2                NaN  953596800  2000   81           NaN      19987
3        0.402539365  954979200  2000   97           NaN      19987
4         0.54021746  956361600  2000  113           NaN      19987
5          0.6156816  957744000  2000  129           NaN      19987
6         0.69301238  959126400  2000  145           NaN      19987
7        0.745426085  960508800  2000  161           NaN      19987
8         0.77601947  961891200  2000  177           NaN      19987
9         0.75455118  963273600  2000  193           NaN      19987
10        0.71251396  964656000  2000  209             1      19987
11        0.67047674  966038400  2000  225           NaN      19987
12        0.68953113  967420800  2000  241           NaN      19987
13        0.63757508  968803200  2000  257           NaN      19987
14        0.56996103  970185600  2000  273           NaN      19987
15         0.5095817  971568000  2000  289           NaN      19987
16        0.41956058  972950400  2000  305             1      19987
17        0.32953946  974332800  2000  321           NaN      19987
18  0.33679403444444  975715200  2000  337             1      19987
19  0.34404860888889  977097600  2000  353             1      19987

这里,JD指的是一年中的某一天(1月1日是第1天)。我想创建一个新的数据框,其中的所有元素都在' Value'列是对一年中所有日期进行线性插值的。

我这样做:

from scipy.interpolate import interp1d
interp1d(df['Value'], df.index, kind='linear')

但这只会填充NaN的现有值。如何填写完全缺失的值,例如第1行是一年中的第49天,但是每年的第50天缺失。

1 个答案:

答案 0 :(得分:2)

您可以将JD值转换为DateTimeIndexresample转换为每日频率((see docs)pandas.Series.interpolate()将填写现有值之间的缺失值Value列中的值如下:

start = date(2000, 1, 1)
df.index = pd.DatetimeIndex(df.JD.apply(lambda x: start + relativedelta(days=int(x)-1)))
df = df.resample('D')
df.loc[:, ['Value', 'JD']] = df.loc[:, ['Value', 'JD']].interpolate(method='linear', limit_direction='both', limit=100)
df.tail(25)

               Value         ts  year   JD  check  group_id
2000-11-24  0.333167        NaN   NaN  329    NaN       NaN
2000-11-25  0.333620        NaN   NaN  330    NaN       NaN
2000-11-26  0.334074        NaN   NaN  331    NaN       NaN
2000-11-27  0.334527        NaN   NaN  332    NaN       NaN
2000-11-28  0.334980        NaN   NaN  333    NaN       NaN
2000-11-29  0.335434        NaN   NaN  334    NaN       NaN
2000-11-30  0.335887        NaN   NaN  335    NaN       NaN
2000-12-01  0.336341        NaN   NaN  336    NaN       NaN
2000-12-02  0.336794  975715200  2000  337      1     19987
2000-12-03  0.337247        NaN   NaN  338    NaN       NaN
2000-12-04  0.337701        NaN   NaN  339    NaN       NaN
2000-12-05  0.338154        NaN   NaN  340    NaN       NaN
2000-12-06  0.338608        NaN   NaN  341    NaN       NaN
2000-12-07  0.339061        NaN   NaN  342    NaN       NaN
2000-12-08  0.339514        NaN   NaN  343    NaN       NaN
2000-12-09  0.339968        NaN   NaN  344    NaN       NaN
2000-12-10  0.340421        NaN   NaN  345    NaN       NaN
2000-12-11  0.340875        NaN   NaN  346    NaN       NaN
2000-12-12  0.341328        NaN   NaN  347    NaN       NaN
2000-12-13  0.341782        NaN   NaN  348    NaN       NaN
2000-12-14  0.342235        NaN   NaN  349    NaN       NaN
2000-12-15  0.342688        NaN   NaN  350    NaN       NaN
2000-12-16  0.343142        NaN   NaN  351    NaN       NaN
2000-12-17  0.343595        NaN   NaN  352    NaN       NaN
2000-12-18  0.344049  977097600  2000  353      1     19987

您会注意到.interpolate()仅在系列开头回填缺失值,这是由于[{1}}的{​​{1}}行为[如scipy docs中所述]。{ {3}}