Extraiga días hábiles en series de tiempo usando Python / Pandas

Estoy trabajando con datos de alta frecuencia en Series de tiempo y me gustaría obtener todos los días hábiles a partir de mis datos . Mis observaciones de datos están separadas por segundos, por lo que hay 86400 segundos cada día y mi conjunto de datos se extiende a lo largo de 31 días (¡por lo que hay 2,678,400 observaciones!).

Aquí está (parte) de mis datos:

In[1]: ts Out[1]: 2013-01-01 00:00:00 0.480928 2013-01-01 00:00:01 0.480928 2013-01-01 00:00:02 0.483977 2013-01-01 00:00:03 0.486725 2013-01-01 00:00:04 0.486725 ... 2013-01-31 23:59:56 0.451630 2013-01-31 23:59:57 0.451630 2013-01-31 23:59:58 0.451630 2013-01-31 23:59:59 0.454683 Freq: S, Length: 2678400 

Lo que me gustaría hacer es crear una nueva serie de tiempo que conste de los días hábiles de este mes, pero me gustaría tenerlos con sus correspondientes segundos de datos. Por ejemplo, si 2013-01-02 (WED) hasta 2013-01-04 (Fri) son los primeros días hábiles de la primera semana de enero, entonces:

 2013-01-02 00:00:00 0.507477 2013-01-02 00:00:01 0.501373 ... 2013-01-03 00:00:00 0.489778 2013-01-03 00:00:01 0.489778 ... 2013-01-04 23:59:58 0.598115 2013-01-04 23:59:59 0.598115 Freq: S, Length: 259200 

por lo que excluirá, por supuesto, todos los datos de los sábados 2013-01-05 y 2013-01-06, ya que estos son los días de fin de semana. y así…

Intenté usar algunos comandos incorporados de pandas, pero no pude encontrar el correcto ya que se agregan por día sin tener en cuenta que cada día contiene sub-columnas en ellos. Es decir, para cada segundo hay un valor y no deben promediarse, simplemente agruparse en una nueva serie.

por ejemplo lo intenté:

  1. ts.asfreq(BDay()) -> encuentra el día hábil pero promedia cada día
  2. ts.resample() -> debe definir ‘cómo’ (media, máx, min …)
  3. ts.groupby(lambda x : x.weekday) -> tampoco!
  4. ts = pd.Series(df, index = pd.bdate_range(start = '2013/01/01 00:00:00', end = '2013/01/31 23:59:59' , freq = 'S')) -> df ya que los datos originales son como DataFramem. El uso de pd.bdate_range no ayudó, ya que df y el índice deben estar en la misma dimensión.

Busqué en la documentación de los pandas, busqué en Google pero no pude encontrar una pista …
Alguien tiene una idea?

¡Realmente agradecería su ayuda!

¡Gracias!

ps. Preferiría no usar bucles para eso, ya que mi conjunto de datos es muy grande … (También tengo otros meses para analizar)

Desafortunadamente, esto es un poco lento, pero al menos debe dar la respuesta que está buscando.

 #create an index of just the date portion of your index (this is the slow step) ts_days = pd.to_datetime(ts.index.date) #create a range of business days over that period bdays = pd.bdate_range(start=ts.index[0].date(), end=ts.index[-1].date()) #Filter the series to just those days contained in the business day range. ts = ts[ts_days.isin(bdays)] 

Los pandas modernos almacenan las marcas de tiempo como numpy.datetime64 con una unidad de tiempo de nanosegundos (uno podría verificarlo mediante la inspección de ts.index.values ). Es mucho más rápido convertir tanto el índice original como el generado por bdate_range a una unidad de tiempo diaria ( [D] ) y verificar la inclusión en estas dos matrices:

 import numpy as np import pandas def _get_days_array(index): "Convert the index to a datetime64[D] array" return index.values.astype('