2012-05-12 9 views
16

ich jetzt zur Analyse einer Reihe von stündlichen Daten seit geraumer Zeit mit Python und Pandas gearbeitet und finde es sehr schön (Von Matlab.)Pandas, python - wie bestimmte Zeiten in Zeitreihen wählen

Jetzt bin ich irgendwie steckengeblieben. Ich habe meine DataFrame wie folgt aus:

SamplingRateMinutes=60 
index = DateRange(initialTime,finalTime, offset=datetools.Minute(SamplingRateMinutes)) 
ts=DataFrame(data, index=index) 

Was soll ich jetzt tun ist, um die Daten für alle Tage in den Stunden 10 bis 13 und 20 bis 23 auszuwählen, um die Daten für weitere Berechnungen zu verwenden. Bisher geschnitten ich die Daten

selectedData=ts[begin:end] 

mit Und ich bin sicher, dass irgendeine Art von schmutzigem Looping erhält die benötigten Daten auszuwählen. Aber es muss einen eleganteren Weg geben, genau zu indizieren, was ich will. Ich bin sicher, dies ist ein häufiges Problem und die Lösung in Pseudo-Code sollte etwas so aussehen:

myIndex=ts.index[10<=ts.index.hour<=13 or 20<=ts.index.hour<=23] 
selectedData=ts[myIndex] 

Zu erwähnen Ich bin Ingenieur und kein programer :) ... noch

Antwort

7

Hier ist ein Beispiel, das tut was Sie wollen:

In [32]: from datetime import datetime as dt 

In [33]: dr = p.DateRange(dt(2009,1,1),dt(2010,12,31), offset=p.datetools.Hour()) 

In [34]: hr = dr.map(lambda x: x.hour) 

In [35]: dt = p.DataFrame(rand(len(dr),2), dr) 

In [36]: dt 

Out[36]: 
<class 'pandas.core.frame.DataFrame'> 
DateRange: 17497 entries, 2009-01-01 00:00:00 to 2010-12-31 00:00:00 
offset: <1 Hour> 
Data columns: 
0 17497 non-null values 
1 17497 non-null values 
dtypes: float64(2) 

In [37]: dt[(hr >= 10) & (hr <=16)] 

Out[37]: 
<class 'pandas.core.frame.DataFrame'> 
Index: 5103 entries, 2009-01-01 10:00:00 to 2010-12-30 16:00:00 
Data columns: 
0 5103 non-null values 
1 5103 non-null values 
dtypes: float64(2) 
+0

Funktioniert! Danke vielmals! –

+2

Hier ist, wie diese Lösung in der Syntax für 0.10 implementiert und mit Wes 'Antwort unten kombiniert werden würde: 'dr = pd.date_range (dt (2009,1,1), dt (2010,12,31), Freq = "H"); dt = pd.DataFrame (rand (len (dr), 2), dr); Stunde = dt.index.hour; selector = ((10 <= Stunde) & (Stunde <= 13)) | ((20 <= Stunde) & (Stunde <= 23)) data = dt [Selektor] ' –

24

In den kommenden Pandas 0.8.0, werden Sie in der Lage zu schreiben

hour = ts.index.hour 
selector = ((10 <= hour) & (hour <= 13)) | ((20 <= hour) & (hour <= 23)) 
data = ts[selector] 
6

Wie es oben in meinem Kommentar unordentlich aussieht, habe ich beschlossen, eine andere Antwort zu geben, die für Pandas 0.10.0 auf Marcs Antwort, kombiniert mit Wes' Hinweis eine Syntax Update:

import pandas as pd 
from datetime import datetime 

dr = pd.date_range(datetime(2009,1,1),datetime(2010,12,31),freq='H') 
dt = pd.DataFrame(rand(len(dr),2),dr) 
hour = dt.index.hour 
selector = ((10 <= hour) & (hour <= 13)) | ((20<=hour) & (hour<=23)) 
data = dt[selector] 
+0

Es gibt einen Konflikt zwischen dt-Paket und dt-Variable –

0

Pandas Datenrahmen verfügt über einen eingebauten in Funktion pandas.DataFrame.between_time

df = pd.DataFrame(np.random.randn(1000, 2), 
        index=pd.date_range(start='2017-01-01', freq='10min', periods=1000)) 

erstellen 2-Datenrahmen für jeden Zeitraum:

df1 = df.between_time(start_time='10:00', end_time='13:00') 
df2 = df.between_time(start_time='20:00', end_time='23:00') 

Datenrahmen Sie wollen zusammengeführt und sortiert df1 und df2:

pd.concat([df1, df2], axis=0).sort_index() 
Verwandte Themen