2017-04-24 1 views
2

Ich habe eine nicht regulirased Daten in einem Intervall von einer Minute wie folgt aus:Pandas - Resampling 1 Minuten-Intervall von nicht regula Daten in einem 3-Stunden-Intervall und Austauschen von Daten mit Daten in einer Reihe von Zeit fehlt

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 

Ich möchte diese Daten für ein Intervall von 3 Stunden (0,3,6,9,12,15,18,21) so aufzeichnen, dass, wenn zum Beispiel die Daten zu der Stunde 18 und der Minute 00 fehlen, Ich ersetze es durch die nächsten Daten in einem Bereich von fünf Minuten nach oder vor der 00 Minute. In diesem Beispiel habe ich die Zeit von 17 57 ist näher an 18 00 als 18 04, damit ich die Daten für die fehlende Zeit 18 00 mit den Daten von 17 57 wie folgt ersetzt:

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 

Wenn ich nicht tun haben Daten im Intervall von fünf Minuten nach oder vor den 00 Minuten nicht abschließen ich die Stunde mit NaN wie diese verlassen die fehlenden Daten:

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 

ich mit dem .resample, dies zu tun ("3H versuchen ') Befehl von Pandas, aber ich weiß nicht, wie es die fehlenden Werte mit den nächsten Daten in einem Bereich von fünf Minuten ersetzt.

Ich versuchte mit der np.searchshorted, aber ich war nicht in der Lage, den Bereich von fünf Minuten damit zu etablieren, so dass ich die Idee fallen lassen.

Mein Code ist jetzt sehr einfach, ich lese gerade eine Textdatei mit den Daten und resample es in einem 3-Stunden-Intervall, ohne die Daten zu ersetzen, damit meine Daten so aussehen, wenn ich es für i extrahiere Textdatei:

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 

Der Code ist:

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

Antwort

1

der merge_asof eine neue Pandas 0.19.0 hinaus versuchen lassen. Sie müssen dies mit mehr Ihrer Eingabedaten testen, die Sie hier angegeben haben. Aber das ist ein Ansatz.

Seien Sie sicher, dass Ihr ‚Datum‘ Feld in Ihrer ursprünglichen df Datumsdaten Zeit

df['Date'] = pd.to_datetime(df['Date']) 

der einige 3 Stunden Zeitblöcke manuell Lassen erstellen:

df_time = pd.DataFrame({'Date':pd.date_range(start='2001-11-14',end='2001-11-15',freq='3H')}) 

Verwendung merge_asof mit einer Toleranz von 5

Protokoll.

df_new = pd.merge_asof(df_time,df, on='Date',tolerance=pd.Timedelta("5 minutes")).fillna('') 

print(df_new) 

Ausgang:

    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

Vielen Dank für Ihre Hilfe und sorry für die Verzögerung bei der Beantwortung. Ihre Antwort hat mir sehr geholfen, aber aufgrund meiner Daten musste ich ein paar Änderungen vornehmen. Am Ende ist mein Code der folgende (Sie können eine Änderung der Bereich des Intervalls für 3 Minuten anstelle von 5 sehen):

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