to_datetime resample datetimeindex date_range python indexing time-series pandas

resample - time series forecasting python



pandas, python-cómo seleccionar tiempos específicos en series temporales (4)

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

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 cálculos adicionales. 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 programador :) ... todavía


Como se ve complicado en mi comentario anterior, decidí proporcionar otra respuesta que es una actualización de sintaxis 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]


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]


Pandas DataFrame tiene una 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))

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 marco de datos que desea se fusiona y ordena df1 y df2:

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