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()