目录
- 一、需求描述
- 二、代码实现
- 三、测试结果
一、需求描述
因工作需要,现需获取任意一个日期的上个工作日,要求考虑法定假日及周末。
例如: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日(周五),验证结果均正确