检测美国节假日
在Python中,最简单的方法来判断一个日期是否是美国的银行假日是什么呢?网上有很多日历和网络服务可以列出不同国家的假期,但我还没有找到专门针对美国银行假日的东西。
7 个回答
31
在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)
你可以找到任何国家的假期,具体的国家列表可以在我的博客上查看。
我的假期博客
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
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)
我相信还有其他方式来指定不符合上述规则的假期……任何这样的消息都欢迎分享。