pandas, python – cómo seleccionar tiempos específicos en series temporales

Trabajé durante bastante tiempo usando python y pandas para analizar un conjunto de datos por hora y me parece bastante agradable (Viniendo de Matlab).

Ahora estoy un poco atascado. 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 las horas 10 a 13 y 20-23 para usar los datos para otros cálculos. Hasta ahora he cortado los datos usando

  selectedData=ts[begin:end] 

Y estoy seguro de obtener algún tipo de bucle sucio para seleccionar los datos necesarios. Pero debe haber una forma 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 debería verse así:

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

Para mencionar que soy ingeniero y no progtwigdor 🙂 … todavía

Aquí hay un ejemplo que hace lo que quieres:

 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]:  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]:  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) 

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] 

Como se ve complicado en mi comentario anterior, decidí proporcionar otra respuesta que es una actualización de syntax para pandas 0.10.0 en la respuesta de Marc, combinada con la sugerencia de Wes:

 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] 

Pandas DataFrame tiene una función incorporada pandas.DataFrame.between_time

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

Crea 2 marcos de datos para cada periodo 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') 

El dataframe que desea se fusiona y ordena df1 y df2:

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