2012-05-12 23 views
16

que trabajé desde hace algún tiempo utilizando Python y pandas para analizar un conjunto de datos horarios y parece bastante agradable (Viniendo de Matlab.)pandas, pitón - cómo seleccionar momentos específicos en series de tiempo

Ahora estoy tipo de atrapado. He creado mi DataFrame así:

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

Lo que quiero hacer ahora es seleccionar los datos para todos los días en el horario de 10 a 13 y 20-23 para utilizar los datos para los cálculos posteriores. Hasta ahora en rodajas los datos utilizando

selectedData=ts[begin:end] 

y estoy seguro de obtener algún tipo de bucle sucia para seleccionar los datos necesarios. Pero debe haber una manera más elegante de indexar exactamente lo que quiero. Estoy seguro de que este es un problema común y la solución en pseudocódigo debe ser algo así:

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

mencionar que soy un ingeniero y programador sin embargo :) ...

Respuesta

7

Aquí hay un ejemplo que hace lo que quiere:

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

¡Trabajos! ¡Muchas gracias! –

+2

Así es como se implementaría esta solución en la sintaxis para 0.10 y combinándola con la respuesta de Wes a continuación: 'dr = pd.date_range (dt (2009,1,1), dt (2010,12,31), frecuencia = 'H'); dt = pd.DataFrame (rand (len (dr), 2), dr); hour = dt.index.hour; selector = ((10 <= hora) & (hora <= 13)) | ((20 <= hora) & (hora <= 23)) datos = dt [selector] ' –

24

En los próximos pandas 0.8.0, podrás escribir

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

Como se ve desordenado en mi comentario anterior, decidí dar otra respuesta que es una actualización de sintaxis para los pandas 0.10.0 sobre la respuesta de Marc, combinado con Wes' pista:

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

hay conflicto de paquete dt y variable dt –

0

pandas trama de datos tiene un built-in función pandas.DataFrame.between_time

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

Crear 2 tramas de datos para cada período de tiempo:

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

trama de datos que desea se funde y se clasifica df1 y df2:

pd.concat([df1, df2], axis=0).sort_index() 
Cuestiones relacionadas