【问题标题】:Linearly interpolate missing rows in pandas dataframe在熊猫数据框中线性插入缺失的行
【发布时间】:2015-12-14 02:35:31
【问题描述】:

我知道了。数据框:

               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 天)。我想创建一个新的数据框,其中“值”列中的所有元素在一年中的所有日子里都是线性插值的。

我正在这样做:

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

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将您的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() 仅在系列开头回填缺失值,这是由于 [scipy 文档] 中所述bound_errorscipy.interp1d 行为。2

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2019-05-30
    • 1970-01-01
    • 2021-10-06
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多