范围之间的美国假期的python列表 [英] python list of usa holidays between a range

查看:179
本文介绍了范围之间的美国假期的python列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要获取给定范围内的假期列表,即开始日期为2016年12月20日&结束日期是10/1/2017,那么我应该得到25/12/2017,1/1/2017.我可以使用Pandas进行此操作,但就我而言,我需要使用AWS Glue服务& AWS Glue不支持熊猫.

I have a need to fetch list of holidays in a given range, i.e., if start date is 20/12/2016 & end date is 10/1/2017, then I should get 25/12/2017, 1/1/2017. I can do this using Pandas, but in my case, I have limitation that I need to AWS Glue service & Pandas are not supported in AWS Glue.

我正在尝试使用本机python库假期,但是我看不到API文档从&之间获取假期.到目前为止?

I am trying to use native python library holidays, but I couldn't see API document to fetch holidays between from & to date?

这是我尝试过的:

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

我需要将一个日期范围(从date到date)传递给us_holidays对象,并且我希望该范围内的假期列表如下所示:

I need to pass a date range, fromdate, todate to the us_holidays object, and I expect list of holidays with in the range, something like the following:

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

在大熊猫中,我可以使用以下命令获取它:

In pandas, I can get it using the following:

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

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

As mentioned above, I need to use AWS Glue, and currently Glue doesn't support Pandas.

请感激任何帮助.

谢谢

推荐答案

经过一段时间的探索,我自己找到了解决方案,在此分享作为解决方案以供参考:

After a while of exploring, I have the got the solution myself, sharing here for reference as a solution:

%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一起使用.尚未更新变量名称,请根据需要进行更改.

This doesn't require Pandas, and I hope this works with AWS Glue. Haven't updated the variable names, please change as necessary.

谢谢

这篇关于范围之间的美国假期的python列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆