说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在业务处理中,经常需要判断某天或者当天是不是工作日,或者是不是休假日,今天我们就用 Python 代码来实现它。
代码的逻辑都标注在注释上,由于我国的公休假日由国务院在年底公布,所以需要自己根据公布的情况及时更新代码中的特殊日期。
收集两种例外情况,形成列表:
设:
上班日为代码先判断是否例外上班日,是返回 True 否则再判断是否例外休息日,如果是则返回 False。接着再判断周几,同一周五返回 True,否则就是周末,返回 False。
注:更新 2021 年法定休假和调休日期
from datetime import datetime
'''
功能:
判断给定日期是工作日还是休息日,考虑了双休和法定假日
每年要更新国务院的休假通知
'''
# 休:正常工作日(周一至周五)放假日期
holidays_exception = [
'20190101', # 元旦,周二
'20190204', # 以下为春节
'20190205', #
'20190206', #
'20190207', #
'20190208', #
'20190405', # 清明
'20190501', # 劳动节
'20190502', #
'20190503', #
'20190607', # 端午节连休放假
'20190913', # 中秋节休
'20191001', # 国庆放假
'20191002', #
'20191003', #
'20191004', #
'20191007', #
'20200101', # 元旦,周三
'20200122', # 公司提前放假
'20200123', # 公司提前放假
'20200124', # 除夕,周五
'20200127', # 春节,周一
'20200128', # 春节
'20200129', # 春节
'20200130', # 春节,周四
'20200131', # 新冠病毒国务院放假
'20200201', # 新冠病毒国务院放假
'20200406', # 清明,周一
'20200501', # 劳动节,周五
'20200504', # 劳动节,周一
'20200505', # 劳动节,周二
'20200625', # 端午,周二
'20200626', # 端午,周二
'20201001', # 国庆,周四
'20201002', # 国庆,周五
'20201005', # 国庆,周一
'20201006', # 国庆,周二
'20201007', # 国庆,周三
'20201008', # 国庆,周四
'20210101', # 元旦,周五 2021 年开始
'20210211', # 除夕,周四
'20210212', # 春节,周五
'20210215', # 春节,周一
'20210216', # 春节,周二
'20210217', # 春节,周三
'20210405', # 清明,周一
'20210503', # 五一,周一
'20210504', # 五一,周二
'20210505', # 五一,周三
'20210614', # 端午调休,周一
'20210920', # 中秋调休,周一
'20210921', # 中秋调休,周二
'20211001', # 国庆调休,周五
'20211004', # 国庆调休,周一
'20211005', # 国庆调休,周二
'20211006', # 国庆调休,周三
'20211007', # 国庆调休,周四
]
# 班:正常周末(周六和周五)上班日期
workdays_exception = [
'20190202' # 春节前调休周末上班
'20190203'
'20190505' # 劳动节调休周末上班
'20200201', # 春节, 周六
'20200426', # 劳动节, 周日
'20200509', # 劳动节, 周六
'20200628', # 端午, 周日
'20200927', # 国庆,周六
'20201010', # 国庆,周六
'20210207', # 春节前调休,周日,2021年开始
'20210220', # 春节后调休,周六
'20210425', # 五一调休,周日
'20210508', # 五一调休,周六
'20210918', # 中秋调休,周六
'20210926', # 中秋调休,周日
'20211009', # 国庆调休,周日
]
def is_workday(day=None):
"""
Args:
day: 日期, 默认为今日
Returns:
True: 今天上班
False: 今天放假
"""
# 如果不传入参数则为今天
today = datetime.today()
# logger.info(today)
day = day or today
# 今天星期几(星期一 = 1,周日 = 7)
week_day = datetime.weekday(day) + 1
# 这周是不是非周末,正常工作日, 不考虑调假
is_work_day_in_week = week_day in range(1, 6)
y, m, d = day.year, day.month, day.day
day_str = f'{str(y).zfill(4)}{str(m).zfill(2)}{str(d).zfill(2)}'
if day_str in workdays_exception:
return True
elif day_str in holidays_exception:
return False
elif is_work_day_in_week:
return True
else:
return False
def is_holiday(day=None):
# 如果不传入参数则为今天
today = datetime.today()
day = day or today
if is_workday(day):
return False
else:
return True
如果判断当天:
is_workday() # 是不是工作日,True 为是
is_holiday() # 是不是休假日,True 为是
判断指定日期:
from datetime import datetime
is_workday(datetime(2020, 8, 1)) # 是不是工作日,True 为是
is_holiday(datetime(2020, 8, 1)) # 是不是休假日,True 为是
在 pandas 中应用:
s = pd.Series(pd.date_range('20210101', periods=8))
s
'''
0 2021-01-01
1 2021-01-02
2 2021-01-03
3 2021-01-04
4 2021-01-05
5 2021-01-06
6 2021-01-07
7 2021-01-08
dtype: datetime64[ns]
'''
# 应用判定是否工作日函数
s.apply(is_workday)
'''
0 False
1 False
2 False
3 True
4 True
5 True
6 True
7 True
dtype: bool
'''
# 修改索引为日期,映射工作、休息字符
(
pd.DataFrame()
.assign(date=s)
.assign(work=s.apply(is_workday))
.assign(text=lambda x: x.work.map({True: '工作', False:'休息'}))
)
'''
date work text
0 2021-01-01 False 休息
1 2021-01-02 False 休息
2 2021-01-03 False 休息
3 2021-01-04 True 工作
4 2021-01-05 True 工作
5 2021-01-06 True 工作
6 2021-01-07 True 工作
7 2021-01-08 True 工作
'''
(完)
更新时间:2021-11-22 22:35:18 标签:python 日期