熊猫 - 在3小时的间隔内重新采样非正规数据的一分钟间隔,并用一段时间内的数据替换丢失的数据

时间:2017-04-24 12:30:08

标签: python pandas resampling

我有一个非调节数据,间隔为一分钟,如下所示:

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所以我用17 57的数据替换缺失时间18 00的数据,如下所示:

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

我正在尝试使用pareas的.resample(' 3H')命令执行此操作,但我不知道如何使用范围内最接近的数据替换缺失值五分钟。

我尝试使用np.searchshorted,但我无法用它来确定五分钟的范围,所以我放弃了这个想法。

我的代码现在非常简单,我只是阅读带有数据的文本文件,并在3小时的时间间隔内对其进行重新取样而不替换数据,因此当我为i文本文件提取数据时,我的数据看起来像这样:

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')

2 个答案:

答案 0 :(得分:1)

让我们试试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          

答案 1 :(得分:1)

感谢您的帮助,并对延迟回复感到抱歉。你的回答对我帮助很大,但由于我的数据,我不得不做一些改变。最后,我的代码如下(您可以看到更改间隔范围3分钟而不是5分钟):

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 = False, date_parser = dateparse)
vento1 = vento.rename(columns={'Dia_Mes_Ano_Hora_Minuto': 'Data'})
vento_time = pd.DataFrame({'Data':pd.date_range(start='2016-07-12 18:00:00',end='2017-02-28 21:00:00',freq='3H')})
vento_2 = pd.merge_asof(vento_time,vento1, on='Data',tolerance=pd.Timedelta("3 minutes")).fillna('NAN')
vento_3 = vento_2.convert_objects(convert_numeric=True)
vento_3.set_index(['Data'], inplace=True)
vento_3.to_csv('vento_3min.csv')