2010-03-06 16 views
13

Wie können Sie am einfachsten feststellen, ob es sich bei einem Datum um einen US-Feiertag in Python handelt? Es scheinen verschiedene Kalender und Web Service Listing Ferien für verschiedene Länder zu sein, aber ich habe nichts spezifisch für Banken in den USAErfassen eines US-Feiertags

+0

@krosenvold: Das ist der Punkt, diese Feiertage normalerweise das Wochenende verlängern und die Leute nennen diese Ferien. Ferien länger als eine Woche fallen in die Sabbatical Kategorie. – mjv

+1

Wie weit im Voraus müssen Sie sie kennen? –

+0

@ Krosenvold: Es ist eine Schande, aber ich kann es nicht leugnen. –

Antwort

5

Einige allgemeine Bemerkungen:

Ich glaube nicht, dass @ von AST4 wirklich bedeutet „n-ten Tag der n-ten Woche nth Monat Algorithmus ". Der Begriff "n-te Woche im n-ten Monat" ist "Geist-knacken" (wie der "ISO-Kalender"). Ich habe noch nie einen Urlaub in der "nten Woche" gesehen. Martin Luther King Day ist ein Beispiel für die „N-ten Wochentag im Monat“ Art von Urlaub:

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) 

Die USA haben nicht Ostern bezogene Feiertage. Definition ist nicht schwer:

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) 

Die ‚Basis‘ Idee verwendet werden kann, für Lunar New Year gerecht zu werden, in der Tat jeden Urlaub, die einen Versatz von einem Basisdatum ist, das ein spezielles Verfahren benötigt es zu berechnen.

Der sogenannte „statische“ Urlaub festgelegt ist nicht, wenn das „feste“ Datum auf einem Samstag oder Sonntag ist und sogar verschwinden kann (keine Alternative Tag der Arbeit):

# 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) 

Ich bin da sicher sind Möglichkeiten, Feiertage zu spezifizieren, die nicht durch die oben genannten Regeln abgedeckt sind ... solche Nachrichten sind willkommen.

+1

Was? ist diese Ferienklasse, die du benutzt? –

+0

@Gringo Suave: Es ist nur eine Notation für die meisten der seltsamen Wege, wie Ferien definiert werden können. –

3

Stellen Sie sicher, Datum gefunden = eine davon:

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

+0

Diese gelten für die US-Botschaft, können aber für jede Bank anders sein: Zum Beispiel ist meine Bank am Columbus Day geöffnet, was kein sehr beliebter Feiertag in Kalifornien ist. –

+0

@Alex Martelli: Ihre Bank ist zwar offen, aber die Fed ist geschlossen, so dass das ACH-Netzwerk am Columbus Day nicht iteriert. Es wird wie ein Samstag behandelt. –

2

I Ich habe kürzlich an einem Problem gearbeitet, das sehr ähnlich ist. Die statischen Feiertage sind eher trivial zu generieren (z. B. Silvester - 31. Dezember, (Zyklus durch Jahre)). Es gibt wohldefinierte Algorithmen, um die Floating Holidays zu generieren. Im Wesentlichen haben Sie ein Startdatum (z. B. 1. Januar 1900) und arbeiten von dort. Was ich am Ende implementiert habe, war ein n-ter Tag der n-ten Woche des n-ten Monats-Algorithmus (z. B. MLK-Tag = 3. Montag im Januar). Ostern ist ein bisschen anders zu tun, aber wieder gibt es wohldefinierte Algorithmen dafür (Karfreitag ist nach dem Januar trivial).

Es gibt ein recht ordentliches Buch gibt es auf dieser heraus Sie prüfen wollen, können: Calendrical Calculations

+0

Ich denke du meinst zu sagen "Karfreitag ist trivial, nachdem du Ostern hast", richtig? Weder der Karfreitag noch der Ostermontag sind normalerweise Feiertage in den USA, und Ostern ist natürlich immer an einem Sonntag und deshalb auch nie ein Geschäftstag. –

+0

Ja Entschuldigung, ich habe viel zu schnell getippt. – ast4

+0

Etwas Klärung (danke John Machin für das Aufzeigen): Bis zum n. Tag meine ich: Montag = 1, Dienstag = 2, Mittwoch = 3, Donnerstag = 4, Freitag = 5, Samstag = 6, Sonntag = 7 – ast4

11

Das Pandas Paket bietet eine praktische Lösung für dieses:

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 
Verwandte Themen