检测美国节日

37

在Python中确定日期是否为美国银行假日的最简单方法是什么?似乎有各种各样的日历和网络服务列出了各个国家的假期,但我没有找到任何特定于美国银行的信息。


@krosenvold:这就是关键,这些银行假期通常会延长周末,人们称之为节日。持续一周以上的假期属于“学术休假”类别。 - mjv
1
你需要提前多久知道它们? - John La Rooy
@krosenvold:真是太可惜了,但我不能否认它。 - Joe Carnahan
1
这因美国各州而异。并没有所有美国银行假日的列表,因为有些州的假日与其他州不同。并非所有联邦假日都被企业所观察。 - S.Lott
1
我使用来自Github的workalendar,可以查看我在另一个类似的线程中的回复https://dev59.com/rHNA5IYBdhLWcg3wQ7i4#21462251。 - Andre Miras
@AndreMiras,很棒的项目。谢谢。 - Cerin
5个回答

56

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 

27

使用Python中的假期库。

pip install holidays

美国假日:

1. 检查日期是否为节假日。

from datetime import date
import holidays

# Select country
us_holidays = holidays.US()

# If it is a holidays then it returns True else False
print('01-01-2018' in us_holidays)
print('02-01-2018' in us_holidays)

# What holidays is it?
print(us_holidays.get('01-01-2018'))
print(us_holidays.get('02-01-2018'))

2. 列出美国的所有假期:

from datetime import date
import holidays

# Select country
us_holidays = holidays.US()

# Print all the holidays in US in year 2018
for ptr in holidays.US(years = 2018).items():
    print(ptr)
你可以在我博客上列出的国家列表中找到任何你喜欢的国家的节假日。 我的节假日博客 Python节假日Github链接

2
很棒的回答!感谢您的第二条评论。我只想补充一点,也可以输入州名,以防某些州不庆祝某些节日 - edesz
2
不确定为什么这里要导入“date”?这是假期包需要吗? - Dat TT

7

一些一般性的评论:

我认为@ast4并不是真正意思说“第n个月的第n周算法”。"第n个月的第n周"这个概念让人难以理解(就像“ISO日历”一样)。我从来没有见过一个假期是按照“第n周”定义的。马丁·路德·金日是“每月第n个工作日”类型的假期的例子:

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)

美国没有与复活节相关的假期。定义并不难:
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'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)

我相信有一些假期的规定并不符合以上规则...欢迎任何此类消息。


2
你正在使用什么样的Holiday类? - Gringo Suave
1
@Gringo Suave:这只是一个表示大多数奇怪的节假日定义方式的符号。 - John Machin
1
我意识到这是一个老问题,但仍然是一个有效的问题;John提到的Holiday类是pandas.tseries.holiday.Holiday。 - rgk

3

这些适用于美国大使馆,但对于任何给定的银行可能会有所不同:例如我的银行在哥伦布日开放,而这在加利福尼亚州并不是一个非常流行的节日。 - Alex Martelli
1
@Alex Martelli:你的银行可能开门,但联邦政府关闭了,所以ACH网络在哥伦布日不会迭代。它被视为星期六。 - Steven Rumbalski

2
我最近实际上处理了一个类似这个问题的问题。静态节假日相当容易生成(例如,除夕 - 12月31日(循环年份))。有明确定义的算法可用于生成浮动假期。基本上,您有一个起始日期(例如,1900年1月1日)并从那里开始工作。我最终实现的是一个第n个月的第n周的第n天算法(例如,马丁·路德·金日=一月的第三个星期一)。复活节有点不同,但是再次已经有明确定义的算法可用于此(在获得1月份之后,耶稣受难日就很容易了)。
这方面有一本相当不错的书,您可能想看看:Calendrical Calculations

我想你的意思是“有了复活节,耶稣受难日就变得微不足道了”,对吧?话虽如此,在美国,无论是耶稣受难日还是复活节星期一都不是正常的假期。而且,复活节总是在星期日,因此从来不是工作日。 - Joe Carnahan
对不起,我打字太快了。 - ast4
一些澄清(感谢John Machin指出):我所说的第n天是指:星期一=1,星期二=2,星期三=3,星期四=4,星期五=5,星期六=6,星期日=7。 - ast4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接