2012-05-12 19 views
16

ho lavorato oggi per un bel po 'di tempo utilizzando Python e panda per l'analisi di una serie di dati orari e lo trovo molto bello (Venendo da Matlab.)panda, pitone - come selezionare orari specifici in timeseries

Ora sono tipo di bloccato. Ho creato il mio DataFrame così:

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

Quello che voglio fare ora è quello di selezionare i dati per tutti i giorni alle ore 10 alle 13 e 20-23 di utilizzare i dati per ulteriori calcoli. Finora ho tagliati i dati utilizzando

selectedData=ts[begin:end] 

e sono sicuro di ottenere un qualche tipo di looping sporco per selezionare i dati necessari. Ma ci deve essere un modo più elegante per indicizzare esattamente quello che voglio. Sono sicuro che questo è un problema comune e la soluzione in pseudocodice dovrebbe apparire un po 'così:

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

Per parlare io sono un ingegnere e non programmatore :) ... ancora

risposta

7

Ecco un esempio che fa ciò che si vuole:

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

Opere! Molte grazie! –

+2

Ecco come questa soluzione sarebbe implementata nella sintassi per 0.10 e combinandola con la risposta di Wes sotto riportata: 'dr = pd.date_range (dt (2009,1,1), dt (2010,12,31), freq = 'H'); dt = pd.DataFrame (rand (len (dr), 2), dr); hour = dt.index.hour; Selettore = ((10 <= ora) & (ora <= 13)) | ((20 <= ora) & (ora <= 23)) data = dt [selector] ' –

24

Nei prossimi panda 0.8.0, sarete in grado di scrivere

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

Come sembra disordinato nel mio commento di cui sopra, ho deciso di fornire un'altra risposta che è un aggiornamento di sintassi per i panda 0.10.0 sulla risposta di Marc, combinata con Wes' suggerimento:

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

c'è conflitto di pacchetto dt e variabile dt –

0

Pandas dataframe ha un built-in funzione pandas.DataFrame.between_time

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

creare 2 frame di dati per ciascun periodo di tempo:

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

frame di dati che si desidera è unito e ordinato df1 e df2:

pd.concat([df1, df2], axis=0).sort_index() 
Problemi correlati