2010-03-06 12 views
13

Jaki jest najprostszy sposób ustalenia, czy data jest świętem bankowym w USA w Pythonie? Wydaje się, że różne kalendarze i usługi sieciowe sprzedaż wakacje dla różnych krajów, ale nie znalazłem nic konkretnego do banków w USAWykrywanie Święta Stanów Zjednoczonych

+0

@krosenvold: To jest punkt, te święta zazwyczaj rozciągają się na weekend i ludzie nazywają te święta. Wakacje dłuższe niż tydzień należą do kategorii urlopów. – mjv

+1

Z jak dużym wyprzedzeniem musisz je znać? –

+0

@krosenvold: To cholerny wstyd, ale nie mogę temu zaprzeczyć. –

Odpowiedz

5

Niektóre uwagi ogólne:

Nie sądzę, że @ AST4 naprawdę oznacza „n-ty dzień n-tego tygodnia algorytm n-tego miesiąca ". Pojęcie "n-ty tydzień w n-tym miesiącu" to przyciąganie uwagi (jak "kalendarz ISO"). Nigdy nie widziałem urlopu zdefiniowanego jako "n-ty tydzień". Martin Luther King Day jest przykładem „n-ty dzień tygodnia w miesiącu” typu wakacje:

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) 

USA nie ma świąt wielkanocnych związanych. Definicja ta nie jest trudna:

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) 

„bazy” pomysł może być stosowany w celu zaspokojenia księżycowego nowego roku, w rzeczywistości żadnych wakacji, który jest odsunięty od daty bazowej, która wymaga specjalnej procedury do jego obliczenia.

Tzw „statyczne” święta nie są ustalone, kiedy „stałe” data przypada w sobotę lub niedzielę, a może nawet zanikać (nie ma alternatywy dzień wolny od pracy):

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

tam jestem pewny są sposoby określania świąt, które nie są zaspokajane przez powyższe zasady ... wszelkie takie wiadomości są mile widziane.

+1

Co czy ta klasa wakacyjna jest używana? –

+0

@Gringo Suave: To po prostu zapis, który pokazuje większość dziwnych sposobów definiowania świąt. –

3
+0

Dotyczą one ambasady USA, ale mogą się różnić w zależności od banku: na przykład mój bank jest otwarty w dniu Columbus Day, który nie jest popularnym świętem w Kalifornii. –

+0

@Alex Martelli: Twój bank może być otwarty, ale sieć zasilająca jest zamknięta, więc sieć ACH nie wykonuje iteracji w Dniu Kolumba. Jest traktowany jak sobota. –

2

I Ostatnio pracowałem nad problemem podobnym do tego. Statyczne święta są raczej trywialne do wygenerowania (np. Sylwester - 31 grudnia (cykl przez lata)). Istnieją dobrze zdefiniowane algorytmy, które generują pływające święta. Zasadniczo masz datę początkową (np. 1 stycznia 1900 r.) I pracujesz stamtąd. W efekcie wprowadziłem n-ty dzień n-tego tygodnia algorytmu n-tego miesiąca (np. Dzień MLK = trzeci poniedziałek stycznia). Wielkanoc jest trochę inna, ale znowu istnieją dobrze zdefiniowane algorytmy do tego już (Wielki Piątek jest trywialny po styczniu).

Jest to dość przyzwoity książka na ten temat tam, może chcesz sprawdzić: Calendrical Calculations

+0

Myślę, że masz na myśli powiedzieć: "Wielki Piątek jest trywialny po Wielkanocy", prawda? W związku z tym ani Wielki Piątek, ani Wielkanocny Poniedziałek nie są zwykle świętami w USA, a Wielkanoc jest oczywiście zawsze w niedzielę, a zatem nigdy nie jest dniem roboczym. –

+0

Tak, przepraszam, pisałem zbyt szybko. – ast4

+0

Kilka wyjaśnień (dzięki John Machin za wskazanie): Do n-tego dnia rozumiem: poniedziałek = 1, wtorek = 2, środa = 3, czwartek = 4, piątek = 5, sobota = 6, niedziela = 7 – ast4

11

Pakiet Pandas zapewnia wygodne rozwiązanie dla tego:

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 
Powiązane problemy