Python实现求解上个工作日逻辑

一、需求描述

因工作需要,现需获取任意一个日期的上个工作日,要求考虑法定假日及周末。

例如: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日(周五),验证结果均正确
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值