¿Cómo subcontratar series temporales de pandas por hora del día?

Estoy tratando de subcontratar una serie de tiempo de pandas que abarca varios días por hora del día. Por ejemplo, solo quiero horarios entre las 12:00 y las 13:00.

Sé cómo hacer esto para una fecha específica, por ejemplo,

In [44]: type(test) Out[44]: pandas.core.frame.DataFrame In [23]: test Out[23]: col1 timestamp 2012-01-14 11:59:56+00:00 3 2012-01-14 11:59:57+00:00 3 2012-01-14 11:59:58+00:00 3 2012-01-14 11:59:59+00:00 3 2012-01-14 12:00:00+00:00 3 2012-01-14 12:00:01+00:00 3 2012-01-14 12:00:02+00:00 3 In [30]: test['2012-01-14 12:00:00' : '2012-01-14 13:00'] Out[30]: col1 timestamp 2012-01-14 12:00:00+00:00 3 2012-01-14 12:00:01+00:00 3 2012-01-14 12:00:02+00:00 3 

Pero no lo he hecho para ninguna fecha usando test.index.hour o test.index.indexer_between_time() cuales fueron sugeridos como respuestas a preguntas similares. Intenté lo siguiente:

 In [44]: type(test) Out[44]: pandas.core.frame.DataFrame In [34]: test[(test.index.hour >= 12) & (test.index.hour < 13)] Out[34]: Empty DataFrame Columns: [col1] Index: [] In [36]: import datetime as dt In [37]: test.index.indexer_between_time(dt.time(12),dt.time(13)) Out[37]: array([], dtype=int64) 

Para el primer enfoque, no tengo ni idea de qué test.index.hour o test.index.minute están devolviendo:

 In [41]: test.index Out[41]:  [2012-01-14 11:59:56, ..., 2012-01-14 12:00:02] Length: 7, Freq: None, Timezone: tzlocal() In [42]: test.index.hour Out[42]: array([11, 23, 0, 0, 0, 0, 0], dtype=int32) In [43]: test.index.minute Out[43]: array([59, 50, 0, 0, 50, 50, 0], dtype=int32) 

¿Qué están volviendo? ¿Cómo puedo hacer el subconjunto deseado? Idealmente, ¿cómo puedo hacer que funcionen los dos enfoques anteriores?

Edición: El problema resultó ser que el índice no era válido, como lo demuestra la Timezone: tzlocal() anterior, ya que tzlocal() no debe permitirse como zona horaria. Cuando cambié mi método de generar el índice a pd.to_datetime() , de acuerdo con la parte final de la respuesta aceptada, todo funcionó como se esperaba.

Asumiendo que el índice es una marca de tiempo de pandas válida, lo siguiente funcionará:

test.index.hour devuelve una matriz que contiene las horas para cada fila en su dataframe. Ex:

 df = pd.DataFrame(randn(100000,1),columns=['A'],index=pd.date_range('20130101',periods=100000,freq='T')) 

df.index.year devuelve una array([2013, 2013, 2013, ..., 2013, 2013, 2013])

Para agarrar todas las filas donde el tiempo es entre 12 y 1, usa

 df.between_time('12:00','13:00') 

Esto capturará ese período de tiempo durante varios días / años, etc. Si el índice no es un pd.to_datetime() tiempo válido, pd.to_datetime() en un pd.to_datetime() tiempo válido usando pd.to_datetime()