2010-03-06 19 views
13

Qual è il modo più semplice per determinare se una data è un giorno festivo negli Stati Uniti in Python? Sembra che ci siano vari calendari e webservices vacanze per vari paesi di quotazione, ma non ho trovato nulla di specifico per le banche negli Stati UnitiRilevamento di una festività negli Stati Uniti

+0

@krosenvold: questo è il punto, questi giorni festivi in ​​genere si estendono il fine settimana e la gente lo chiamano queste vacanze. Le vacanze più lunghe di una settimana rientrano nella categoria sabbatica. – mjv

+1

Con quanto anticipo è necessario conoscerli? –

+0

@krosenvold: È un vero peccato, ma non posso negarlo. –

risposta

5

Alcune osservazioni di carattere generale:

Non penso che @ AST4 davvero significa "giorno n-esimo della settimana ennesima di algoritmo del nono mese ". La nozione di "ennesima settimana all'ennesimo mese" è un rompicapo mentale (come il "calendario ISO"). Non ho mai visto una vacanza definita in termini di "ennesima settimana". Martin Luther King è un esempio del tipo "giorno della settimana Ennesimo nel mese" di vacanza:

MONDAY, ...., SATURDAY = range(7) 
JAN, ....., DEC = range(1, 12) 

Holiday("Martin L King's Birthday", type='floating', 
    ordinal=3, weekday=MON, month=JAN) 
Holiday("Memorial Day", type='floating', 
    ordinal=-1, weekday=MON, month=MAY) 

Gli Stati Uniti non dispone vacanze di Pasqua-correlati. Definizione non è difficile:

Holiday("Good Friday", type='moveable', 
    base='gregorian_easter', delta_days=-2) 
Holiday("Easter Monday", etc, delta_days=1) 
# Some states in Australia used to have Easter Tuesday (no kidding) 
Holiday("Easter Tuesday", etc, delta_days=2) 

L'idea 'base' può essere utilizzato per soddisfare il nuovo anno lunare, infatti ogni tipo di vacanza che è un offset da una data di base che ha bisogno di una procedura speciale per calcolarlo.

Le cosiddette vacanze "statici" non sono fissi quando la data "fisso" è un Sabato o Domenica e possono anche scomparire (senza giorno di assenza dal lavoro alternative):

# Americans will get a day off on Friday 31 Dec 2010 
# because 1 Jan 2011 is a Saturday. 
Holiday("New Year's Day", type='fixed', 
    day=1, month=JAN, sat_adj=-1, sun_adj=????) 

# Australia observes ANZAC Day on the day, with no day off 
# if the fixed date falls on a weekend. 
Holiday("ANZAC Day", type='fixed', day=25, month=APR, sat_adj=0, sun_adj=0) 

# Two consecutive "fixed" holidays is OK; three would need re-thinking. 
# Australia again: 
Holiday("Christmas Day", type='fixed', day=25, month=DEC, sat_adj=2, sun_adj=1) 
Holiday("Boxing Day", type='fixed', day=26, month=DEC, sat_adj=2, sun_adj=2) 

Sono sicuro che ci sono modi di specificare le festività che non sono soddisfatte dalle regole di cui sopra ... qualsiasi notizia di questo tipo è la benvenuta.

+1

Cosa è questa classe di vacanze che stai usando? –

+0

@Gringo Suave: È solo una notazione per mostrare la maggior parte dei modi strani che le vacanze possono essere definite. –

3

Assicurarsi data certa = uno di questi:!

http://www.buyusa.gov/uk/en/us_bank_holidays.html

+0

Questi si applicano all'ambasciata degli Stati Uniti, ma possono variare a seconda della banca: ad esempio, la mia banca è aperta a Columbus Day, che non è una festa molto popolare in California. –

+0

@Alex Martelli: la tua banca potrebbe essere aperta, ma l'alimentazione è chiusa, quindi la rete ACH non scorre su Columbus Day. È trattato come un sabato. –

2

I In realtà ha lavorato di recente su un problema molto simile a questo. Le festività statiche sono piuttosto banali da generare (ad es. Capodanno - 31 dicembre (ciclo di anni)). Ci sono algoritmi ben definiti là fuori per generare le vacanze fluttuanti. Essenzialmente hai una data di inizio (ad esempio, il 1 ° gennaio 1900) e lavori da lì. Ciò che ho finito per implementare è stato un ennesimo giorno dell'ennesimo algoritmo dell'undicesima settimana (ad esempio MLK day = 3rd Monday of January). La Pasqua è un po 'diversa da fare, ma ancora una volta ci sono algoritmi ben definiti per quello già là fuori (il Venerdì Santo è banale dopo aver gennaio).

C'è un libro abbastanza decente su questo là fuori si consiglia di controllare: Calendrical Calculations

+0

Penso che tu intenda dire "Il venerdì santo è banale dopo che hai Pasqua", giusto? Detto questo, né il Venerdì Santo né il Lunedì di Pasqua sono normalmente festivi negli Stati Uniti, e la Pasqua è ovviamente sempre di domenica e quindi mai un giorno lavorativo comunque. –

+0

Sì, scusa, stavo scrivendo troppo in fretta. – ast4

+0

Alcuni chiarimenti (grazie a John Machin per indicarlo): Per n ° giorno intendo: lunedì = 1, martedì = 2, mercoledì = 3, giovedì = 4, venerdì = 5, sabato = 6, domenica = 7 – ast4

11

Il pacchetto Pandas fornisce una soluzione conveniente per questo:

from pandas.tseries.holiday import USFederalHolidayCalendar 
cal = USFederalHolidayCalendar() 
holidays = cal.holidays(start='2014-01-01', end='2014-12-31').to_pydatetime() 
if datetime.datetime(2014,01,01) in holidays: 
    print True 
Problemi correlati