Обнаружение американского праздника

Какой самый простой способ определить, является ли дата праздником в США на Python? Кажется, существуют различные календари и веб-сервисы, перечисляющие праздники для разных стран, но я не нашел ничего конкретного для банков в США.

Ответы

Ответ 1

Некоторые общие комментарии:

Я не думаю, что @ast4 действительно означает "n-й день n-й недели алгоритма n-го месяца". Понятие "n-я неделя в n-м месяце" - это умение (например, "календарь ISO" ). Я никогда не видел праздника, определенного с точки зрения "n-й недели". День Мартина Лютера Кинга - пример праздника "Nth weekday in month":

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

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

В США нет праздников, связанных с Пасхой. Определение не сложно:

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)

Идею "базы" можно использовать для удовлетворения лунного нового года, фактически любого праздника, который является смещением от базовой даты, для которой требуется специальная процедура для ее расчета.

Так называемые "статические" праздники не фиксируются, когда "фиксированная" дата - суббота или воскресенье и может даже исчезнуть (нет альтернативного выходного дня):

# Americans will get a day off on Friday 31 Dec 2010
# because 1 Jan 2011 is a Saturday.
Holiday("New Year 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)

Я уверен, что есть способы указать праздники, на которые не распространяются приведенные выше правила... любые такие новости приветствуются.

Ответ 2

Пакет Pandas обеспечивает удобное решение для этого:

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 

Ответ 4

Недавно я работал над проблемой, подобной этой. Статические праздники довольно тривиальны для генерации (например, Новый год - 31 декабря, (цикл в годах)). Существуют хорошо определенные алгоритмы для генерации плавающих праздников. По существу у вас есть дата начала (например, 1 января 1900 года) и работа оттуда. То, что я закончил, было n-м днем ​​n-й недели алгоритма n-го месяца (например, MLK-день = третий понедельник января). Пасха немного отличается, но снова есть хорошо определенные алгоритмы для этого уже там (Страстная пятница тривиальна после того, как у вас есть январь).

Там есть довольно приличная книга об этом, вы можете проверить: Календарные вычисления