工作與學習中,有個場景需要判斷指定日期是不是工作日,例如自動化辦公工作日自動發郵件,量化交易判斷是否為交易日等等, 因此我們需要能準確判斷給的日期是不是工作日,Python中一般使用模組chinesecalendar
來解決這個問題。
網友自己維護
from datetime import datetime
# 休:正常工作日(週一至週五)放假日期
holidays_exception = [
'20200101', # 元旦,週三
'20200122', # 如:公司提前放假
'20200123', # 如:公司提前放假
'20200124', # 除夕,週五
'20200127', # 春節,週一
'20200128', # 春節
'20200129', # 春節
'20200130', # 春節,週四
'20200131', # 新冠疫情國務院放假
'20200201', # 新冠疫情國務院放假
'20200406', # 清明,週一
'20200501', # 勞動節,週五
'20200504', # 勞動節,週一
'20200505', # 勞動節,週二
'20200625', # 端午,週二
'20200626', # 端午,週二
'20201001', # 國慶,週四
'20201002', # 國慶,週五
'20201005', # 國慶,週一
'20201006', # 國慶,週二
'20201007', # 國慶,週三
'20201008', # 國慶,週四
]
# 班:正常週末(週六和週五)上班日期
workdays_exception = [
'20200201', # 春節, 週六
'20200426', # 勞動節, 週日
'20200509', # 勞動節, 週六
'20200628', # 端午, 週日
'20200927', # 國慶,週六
'20201010', # 國慶,週六
]
def is_workday(day=None):
"""
Args:
day: 日期, 預設為今日
Returns:
True: 上班
False: 放假
"""
# 如果不傳入引數則為今天
today = datetime.today()
# logger.info(today)
day = day or today
week_day = datetime.weekday(day) + 1 # 今天星期幾(星期一 = 1,週日 = 7)
is_work_day_in_week = week_day in range(1, 6) # 這周是不是非週末,正常工作日, 不考慮調假
day_str = f'{day.year}{str(day.month).zfill(2)}{str(day.day).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(datetime(2020, 8, 1)) # 不是工作日,False
is_holiday(datetime(2020, 8, 1)) # 是休假日,True
# 判斷當天
is_workday() # 是不是工作日,True 為是
is_holiday() # 是不是休假日,True 為是
安裝
官方文件:https://pypi.org/project/chinesecalendar/
pip install chinesecalendar
使用
import datetime
from chinese_calendar import is_workday
# 判斷是否為工作日
date = datetime.datetime.now().date()
date2 = datetime.date(2023, 9, 25)
if is_workday(date2):
print("是工作日")
else:
print("是休息日")
# 判斷是否為調休日
from chinese_calendar import is_in_lieu
print(is_in_lieu(date2))
來自: 每日一模組:chinesecalendar