一个范围之间的美国假期的python列表

Posted

技术标签:

【中文标题】一个范围之间的美国假期的python列表【英文标题】:python list of usa holidays between a range 【发布时间】:2018-03-14 08:17:38 【问题描述】:

我需要获取给定范围内的假期列表,即,如果开始日期是 2016 年 12 月 20 日,结束日期是 2017 年 10 月 1 日,那么我应该得到 25/12/2017, 1/ 1/2017。我可以使用 Pandas 做到这一点,但在我的情况下,我需要 AWS Glue 服务并且 AWS Glue 不支持 Pandas。

我正在尝试使用原生 python 库假期,但我看不到 API 文档来获取从 & 到日期之间的假期?

这是我尝试过的:

import holidays
import datetime
from datetime import date, timedelta
import dateutil
from dateutil.relativedelta import relativedelta

us_holidays = holidays.UnitedStates()

for date2,name in sorted(holidays.US(state='CA', years=2013).items()):
    print (date2,name)


days_from_closest_holiday = [(abs(fdate - hdate)).days for hdate in holidays.date.tolist()]
print days_from_closest_holiday

us_holidays 的输出:

(datetime.date(2013, 1, 1), "New Year's Day")
(datetime.date(2013, 1, 21), 'Martin Luther King, Jr. Day')
(datetime.date(2013, 2, 18), "Washington's Birthday")
(datetime.date(2013, 3, 31), 'C\xc3\xa9sar Ch\xc3\xa1vez Day')
(datetime.date(2013, 4, 1), 'C\xc3\xa9sar Ch\xc3\xa1vez Day (Observed)')
(datetime.date(2013, 5, 27), 'Memorial Day')
(datetime.date(2013, 7, 4), 'Independence Day')
(datetime.date(2013, 9, 2), 'Labor Day')
(datetime.date(2013, 10, 14), 'Columbus Day')
(datetime.date(2013, 11, 11), 'Veterans Day')
(datetime.date(2013, 11, 28), 'Thanksgiving')
(datetime.date(2013, 12, 25), 'Christmas Day')

我需要将日期范围 fromdate、todate 传递给 us_holidays 对象,并且我希望在该范围内列出假期列表,如下所示:

DatetimeIndex(['2013-12-25', '2014-01-01'], dtype='datetime64[ns]', freq=None)
[10, 17]

在 pandas 中,我可以使用以下方法获取它:

cal = USFederalHolidayCalendar()
holidays = pd.to_datetime(cal.holidays(start_date, end_date))
print holidays

如上所述,我需要使用 AWS Glue,目前 Glue 不支持 Pandas。

感谢任何帮助。

谢谢

【问题讨论】:

【参考方案1】:

经过一段时间的摸索,自己得到了解决方案,在这里分享以作为解决方案参考:

%pyspark
import holidays
import datetime
from datetime import date, timedelta
import dateutil
from dateutil.relativedelta import relativedelta

us_holidays = holidays.UnitedStates()
custom_holidays = holidays.HolidayBase()
holidays_within_range=[]
fmt = '%Y-%m-%d'
holidays2013=[]

for date2,name in sorted(holidays.US(state='CA', years=2013).items()):
    holidays2013.append(date2.strftime(fmt))
print holidays2013

fdate = date(2013, 1, 1)

s_date = fdate - dateutil.relativedelta.relativedelta(days=7)
e_date = fdate + relativedelta(months=1)
start_date = s_date.strftime(fmt)
end_date = e_date.strftime(fmt)
print "Range : "
print start_date, end_date

dd = [s_date + timedelta(days=x) for x in range((e_date-s_date).days + 1)]
for d in dd:
    if(d in us_holidays):
        custom_holidays.append(d)
        holidays_within_range.append(d.strftime(fmt))

print holidays_within_range
days_from_closest_holiday = [(abs(fdate - datetime.datetime.strptime(hdate, fmt).date())).days for hdate in holidays_within_range]
print days_from_closest_holiday

上述输出将是:

['2013-01-01', '2013-01-21', '2013-02-18', '2013-03-31', '2013-04-01', '2013-05-27', '2013-07-04', '2013-09-02', '2013-10-14', '2013-11-11', '2013-11-28', '2013-12-25']
Range : 
2012-12-25 2013-02-01
['2012-12-25', '2013-01-01', '2013-01-21']
[7, 0, 20]

这不需要 Pandas,我希望这适用于 AWS Glue。尚未更新变量名,请根据需要更改。

谢谢

【讨论】:

以上是关于一个范围之间的美国假期的python列表的主要内容,如果未能解决你的问题,请参考以下文章

Python在列表或数组中查找范围之间的数字

python获取假期范围 青少年编程电子学会python编程等级考试三级真题解析2021年6月

python发展史

python发展史

python的发展历史

pytho常用模块2——random