2015-04-17 10 views
8

Ho una cornice dati panda con la colonna della data e sto provando ad aggiungere una nuova colonna di valori booleani che indicano se una determinata data è una festività o meno.Panda: verificare se una data è una festività e assegnare il valore booleano

Di seguito è riportato il codice, ma non funziona (tutti i valori sono False) perché i tipi sembrano essere diversi e non riesco a capire come ottenere la 'data' nel frame di dati dei panda per essere dello stesso tipo delle vacanze:

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]) 
+0

puoi mostrarci la dichiarazione per "USFederalHolidayCalendar'? –

+0

da pandas.tseries.holiday import USFederalHolidayCalendar – Gopala

risposta

14

Non è necessario convertire nulla. Basta confrontare direttamente. pandas è abbastanza intelligente da confrontare molti tipi diversi per quanto riguarda le date e gli orari. Devi avere un formato leggermente più esoterico se hai problemi con la compatibilità data/ora.

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 

Risultato:

  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 

noti che 4 luglio 2015 cade di Sabato.

2

Ho avuto lo stesso problema dell'autore e l'altra correzione fornita non funzionava per me. Questo è ciò che ha funzionato:

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

Come ho detto, un "formato leggermente più esoterico". Se avevi bisogno di convertire in 'datetime64', la colonna' date' ha un formato che 'pandas' non è riuscito a identificare direttamente. Per casi come questo, è necessaria una conversione. Per quanto riguarda la richiesta dell'OP, ha convertito le sue date in "corretto" tipo di dati Python tramite 'to_pydatetime()', che 'pandas' può convertire con un problema di nary. :) Ancora, +1 per affrontare un caso che non mi ha disturbato a prendere. – Manhattan

+0

Non sono sicuro che lo fosse perché la colonna "data" contiene anche delle ore, ma ho dovuto usare questa soluzione al posto della risposta sopra. Grazie MH. – pshep123

Problemi correlati