我有一分钟间隔内的非规范数据,如下所示:
Date Vel Dir
14-11-2001 17:55:00 14.1 35
14-11-2001 17:56:00 10.4 52
14-11-2001 17:57:00 14.8 19
14-11-2001 18:04:00 11.4 54
14-11-2001 18:05:00 7.6 13
我想以 3 小时(0,3,6,9,12,15,18,21)为间隔对该数据进行重新采样,例如 18 小时和 00 分钟的数据是缺失,我将其替换为 00 分钟前后五分钟范围内最接近的数据。在此示例中,我的时间 17 57 比 18 04 更接近 18 00,因此我将缺失时间 18 00 的数据替换为 17 57 的数据,如下所示:
14-11-2001 15:00:00 5.8 43
14-11-2001 18:00:00 14.8 19
14-11-2001 21:00:00 17.4 68
如果我在 00 分钟之后或之前的五分钟间隔内没有数据,我不会完成丢失的数据,使该小时带有 NaN,如下所示:
14-11-2001 15:00:00 5.8 43
14-11-2001 18:00:00 NaN NaN
14-11-2001 21:00:00 17.4 68
我正在尝试使用 pandas 的 .resample('3H') 命令来执行此操作,但我不知道如何用五分钟范围内最接近的数据替换缺失值。
我尝试使用 np.searchshorted 但我无法用它确定五分钟的范围,所以我放弃了这个想法。
我现在的代码非常简单,我只是读取一个包含数据的文本文件,并以 3 小时的间隔对其进行重新采样,而不替换数据,因此当我为文本文件提取数据时,我的数据看起来像这样:
Date Vel Dir
14-11-2001 15:00:00 5.8 43
14-11-2001 18:00:00
14-11-2001 21:00:00 17.4 68
代码是:
import numpy as np
import pandas as pd
dateparse = lambda x: pd.datetime.strptime(x,'%d %m %Y %H %M')
vento= pd.read_csv('vento.txt',header=0, delim_whitespace= True, parse_dates = [['Dia', 'Mes', 'Ano', 'Hora','Minuto']], index_col = 0, date_parser = dateparse)
vento_2=vento.resample('3H')
vento_2.to_csv(r'data.txt',index=True, index_label=None, sep='\t')
最佳答案
我们来试试 merge_asof
添加了新的 pandas 0.19.0。您必须使用此处提供的更多输入数据对此进行测试。但这是一种方法。
确保原始 df 中的“日期”字段是日期时间数据时间
df['Date'] = pd.to_datetime(df['Date'])
让我们手动创建大约三个小时的时间段:
df_time = pd.DataFrame({'Date':pd.date_range(start='2001-11-14',end='2001-11-15',freq='3H')})
使用merge_asof
,容差为 5 分钟。
df_new = pd.merge_asof(df_time,df, on='Date',tolerance=pd.Timedelta("5 minutes")).fillna('')
print(df_new)
输出:
Date Vel Dir
0 2001-11-14 00:00:00
1 2001-11-14 03:00:00
2 2001-11-14 06:00:00
3 2001-11-14 09:00:00
4 2001-11-14 12:00:00
5 2001-11-14 15:00:00
6 2001-11-14 18:00:00 14.8 19
7 2001-11-14 21:00:00
8 2001-11-15 00:00:00
关于python - Pandas - 以 3 小时的间隔对非正则化数据的一分钟间隔进行重新采样,并用一定时间范围内的数据替换丢失的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43588138/