使用此代码:
import numpy as np
import pandas as pd
df = pd.read_csv('wind.txt', header=0, delim_whitespace= True, index_col = True)
Dataframe是这样的:
Date Vel Dir
2016-07-12 16:15:00 2.8 1.8
2016-07-12 16:16:00 3.9 21.8
2016-07-12 16:17:00 9.8 4.8
2016-07-12 16:18:00 16.9 5.8
2016-07-12 16:19:00 17.0 7.1
2016-07-12 16:20:00 NaN NaN
2016-07-12 16:21:00 2.8 1.8
2016-07-12 16:22:00 3.9 21.8
... ... ...
... ... ...
2017-01-01 00:00:00 21.2 19.7
有时,数据框中有很多缺少的数据,如下所示:
Date Vel Dir
2016-07-12 17:56:00 2.8 1.8
2016-07-12 17:57:00 NaN NaN
2016-07-12 17:58:00 9.8 4.8
2016-07-12 17:59:00 NaN NaN
2016-07-12 18:00:00 NaN NaN
2016-07-12 18:01:00 NaN NaN
2016-07-12 18:02:00 2.8 1.8
2016-07-12 18:03:00 NaN NaN
... ... ...
... ... ...
2017-01-01 00:00:00 21.2 19.7
第一个目标是创建一个新的数据帧,而是在3分钟内在1分钟内使用时间。使用此代码:
df2 = pd.DataFrame({'Date':pd.date_range(start='2016-07-12 18:00:00',end='2017-01-01 00:00:00',freq='3H')})
直到这里一切都还可以,这会产生一个没有Vel和Dir的数据帧,就像那样:
Date
2016-07-12 18:00:00
2016-07-12 21:00:00
2016-07-13 00:00:00
2016-07-13 03:00:00
... ...
... ...
2017-01-01 00:00:00
现在的目标是根据Date
使用df1的Vel和Dir值填充df2,但是缺少一些数据。知道这个我在这段代码中尝试了merge_asof:
df3 = pd.merge_asof(df2,df1, on='Date', tolerance=pd.Timedelta("5 minutes")).fillna('NaN')
它有效,但它只填充前一行的缺失数据。目标是使用之前和之后的行中的值来填充缺失的数据。这样的事情:
Date Vel Dir
2016-07-12 17:56:00 2.8 1.8
2016-07-12 17:57:00 NaN NaN
2016-07-12 17:58:00 9.8 4.8
2016-07-12 17:59:00 NaN NaN
2016-07-12 18:00:00 NaN NaN
2016-07-12 18:01:00 NaN NaN
2016-07-12 18:02:00 2.8 1.8
2016-07-12 18:03:00 NaN NaN
... ... ...
... ... ...
2017-01-01 00:00:00 21.2 19.7
预期产出:
2016-07-12 18:00:00 9.8 4.8
但如果数据框如下:
Date Vel Dir
2016-07-12 17:56:00 NaN NaN
2016-07-12 17:57:00 NaN NaN
2016-07-12 17:58:00 NaN NaN
2016-07-12 17:59:00 NaN NaN
2016-07-12 18:00:00 NaN NaN
2016-07-12 18:01:00 NaN NaN
2016-07-12 18:02:00 2.8 1.8
2016-07-12 18:03:00 NaN NaN
... ... ...
... ... ...
2017-01-01 00:00:00 21.2 19.7
预期产出:
2016-07-12 18:00:00 2.8 1.8
目标是对所有数据帧执行此操作,如果在Vel和Dir必须为NaN
之前或之后的5分钟内不存在任何值。如果有人可以提供帮助,将会很有帮助。
答案 0 :(得分:2)
让我们使用Pandas版本0.20.1和pd.merge_asof
参数direction='nearest'
:
df3 = pd.merge_asof(df2,df1, on='Date', tolerance=pd.Timedelta("5 minutes"), direction='nearest').fillna('NaN')