python - 用 5 分钟范围内最接近的行值填充缺失值

标签 python pandas dataframe

使用这段代码:

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

第一个目标是创建一个新的数据框,但将 1 分钟内的时间改为 3 小时内的使用时间。使用此代码:

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 之前或之后的 5 分钟内不存在任何值,则必须为 NaN。如果有人可以提供帮助,将会很有帮助。

最佳答案

让我们使用带有参数 direction='nearest' 的 Pandas 版本 0.20.1 和 pd.merge_asof:

df3 = pd.merge_asof(df2,df1, on='Date', tolerance=pd.Timedelta("5 minutes"), direction='nearest').fillna('NaN')

关于python - 用 5 分钟范围内最接近的行值填充缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44051022/

相关文章:

python - 将嵌套字典替换为空数据帧

r - 按 id 匹配并在两个数据帧中划分列值

python - 何时在 http 请求中使用 'raw' 属性

python - 如何解决 "TypeError: string indices must be integers"错误?

python - 使用fmin_l_bfgs_b时由边界引起的错误

python - Pandas - Groupby 并创建新的 DataFrame?

python - pandas hist 上的 matplotlib 参数的语法

python - 如何在 python 中 pickle 一个动态创建的嵌套类?

python - Pandas groupby : treat two columns as one

r - 在 R 中,根据不同列中的字​​符串提取行