目录
- 一、需求描述
- 二、代码实现
- 三、测试结果
一、需求描述
因工作需要,现需获取任意一个日期的上个工作日,要求考虑法定假日及周末。
例如:2024年2月10日(春节)的上一个工作日为2024年2月9日,2024年2月17日的上一个工作日仍为2024年2月9日,而2024年2月18日的上一个工作日为2月17日,以此类推
二、代码实现
# 获取上个工作日逻辑,包含节假日、调休逻辑
import datetime
import pandas as pd
import chinese_calendar
def get_last_workday(today):
"""
获取上一个工作日的年月日字符串
"""
weekday = today.weekday()
# 如果今天是周天,上一个工作日是上周五;如果周六补班,上个工作日则是周六
if weekday == 6:
last_workday = today - datetime.timedelta(days=1)
# 周六不上班则上个工作日为周五
if chinese_calendar.is_holiday(last_workday):
last_workday -= datetime.timedelta(days=1)
else:
last_workday = today - datetime.timedelta(days=1) #不变
else:
# 否则,上一个工作日就是昨天
last_workday = today - datetime.timedelta(days=1)
# 如果上一个工作日是法定节假日,则调整为法定节假日结束后的第一个工作日
while chinese_calendar.is_holiday(last_workday):
last_workday -= datetime.timedelta(days=1)
return last_workday.strftime('%Y-%m-%d')
def get_date_df(dates,last_workday_list):
'''
输出最终24年每天的对应上个工作日,以及当天的工作日标签
'''
date_df = pd.concat([pd.Series(dates),pd.Series(lastwork_day_list)],axis=1)
date_df.columns = ['sc_date','last_work_day']
date_df['is_workday'] = pd.Series(map(lambda x:1 if chinese_calendar.is_workday(x) else 0,dates))
date_df ['sc_date'] = date_df['sc_date'].apply(lambda x:x.strftime('%Y-%m-%d'))
return date_df
if __name__ == '__main__':
# 获取日期数据
dates = pd.date_range(start='2024-01-01', end='2024-12-31')
lastwork_day_list = list(map(get_last_workday,dates))
data1 = get_date_df(dates,lastwork_day_list)
data1
输出结果如下,生成三列数据:第一列为2024年每天日期,第二列为其对应的上个工作日,第三列为是否为工作日标签
三、测试结果
以春节假期为例,分别取节中,节后的上个工作日,其对应的均是2月9日,而节后第二天的上个工作日则为2月18日;再以普通工作日2月26日(周一)为例,上个工作日则为2月23日(周五),验证结果均正确