我有这个人。数据帧:
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天缺失。
答案 0 :(得分:2)
您可以将JD
值转换为DateTimeIndex
和resample
转换为每日频率((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}}