Pandas: verificando si una fecha es festiva y asignando un valor booleano

Tengo un dataframe de pandas con una columna de fecha, y estoy tratando de agregar una nueva columna de valores booleanos que indiquen si una fecha determinada es un día festivo o no.

A continuación se muestra el código, pero no funciona (todos los valores son Falso) porque los tipos parecen ser diferentes, y no puedo averiguar cómo obtener la ‘fecha’ en el dataframe de pandas para que sea del mismo tipo como las vacaciones

cal = USFederalHolidayCalendar() holidays = cal.holidays(start=train_df['date'].min(), end=train_df['date'].max()).to_pydatetime() train_df['holiday'] = train_df['date'].isin(holidays) print type(train_df['date'][1]) print type(holidays[0]) 

No necesitas convertir nada. Simplemente compare directamente hacia arriba. pandas es lo suficientemente inteligente como para comparar muchos tipos diferentes con respecto a fechas y horas. Debe tener un formato un poco más esotérico si tiene problemas con la compatibilidad de fecha / hora.

 import pandas as pd from pandas.tseries.holiday import USFederalHolidayCalendar as calendar dr = pd.date_range(start='2015-07-01', end='2015-07-31') df = pd.DataFrame() df['Date'] = dr cal = calendar() holidays = cal.holidays(start=dr.min(), end=dr.max()) df['Holiday'] = df['Date'].isin(holidays) print df 

Resultado:

  Date Holiday 0 2015-07-01 False 1 2015-07-02 False 2 2015-07-03 True 3 2015-07-04 False 4 2015-07-05 False 5 2015-07-06 False 6 2015-07-07 False 7 2015-07-08 False 8 2015-07-09 False 9 2015-07-10 False 10 2015-07-11 False 11 2015-07-12 False 12 2015-07-13 False 13 2015-07-14 False 14 2015-07-15 False 15 2015-07-16 False 16 2015-07-17 False 17 2015-07-18 False 18 2015-07-19 False 19 2015-07-20 False 20 2015-07-21 False 21 2015-07-22 False 22 2015-07-23 False 23 2015-07-24 False 24 2015-07-25 False 25 2015-07-26 False 26 2015-07-27 False 27 2015-07-28 False 28 2015-07-29 False 29 2015-07-30 False 30 2015-07-31 False 

Tenga en cuenta que el 4 de julio de 2015 cae en un sábado.

Tuve el mismo problema que el autor, y la otra solución proporcionada no funcionó para mí. Esto es lo que funcionó:

 train_df['holiday'] = train_df['date'].dt.date.astype('datetime64').isin(holidays)