2017-04-24 37 views
2

与数据替换丢失的数据I具有非regulirased数据在这样一分钟的间隔:熊猫 - 重新取样非正规化数据一个分钟间隔在3个小时的间隔和在一个时间范围

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 

我想在,例如,如果在18小时和00分钟的数据缺失的方式来重新取样该数据为3小时(0,3,6,9,12,15,18,21)的间隔,我用在00分钟之后或之前五分钟范围内最近的数据替换它。在这个例子中,我的17 57的时间接近18比00 18 04,所以我用的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 

,如果我不

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 

我试图与.resample做到这一点('3H:后或00分钟之前,我没有完成丢失的数据离开小时与南这样有五分钟的时间间隔数据')熊猫命令,但我不知道如何去做,用5分钟范围内最近的数据替换缺失的值。

我尝试使用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') 

回答

1

让我们尝试merge_asof一个新的大熊猫0.19.0增加。您将不得不使用您在此处提供的更多输入数据对此进行测试。但这是一种方法。

一定要在你原来的DF你的“日期”字段是datetime数据时

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

感谢您的帮助和抱歉在回答延迟。你的答案帮了我很多,但是由于我的数据我不得不做出一些改变。最后,我的代码如下(您可以看到更改间隔的范围为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') 
相关问题