• 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    输出结果如下,生成三列数据:第一列为2024年每天日期,第二列为其对应的上个工作日,第三列为是否为工作日标签

    三、测试结果

    以春节假期为例,分别取节中,节后的上个工作日,其对应的均是2月9日,而节后第二天的上个工作日则为2月18日;再以普通工作日2月26日(周一)为例,上个工作日则为2月23日(周五),验证结果均正确
    在这里插入图片描述

  • 相关阅读:
    Nginx平滑升级的详细操作方法
    彻底理解代理模式
    一文掌握Python多线程与多进程
    mac 安装docker
    代码应该怎么写?
    ArcGIS属性域和子类型
    安全架构设计理论与实践
    Java接口Json数组入参转换为指定List<Entity>
    路由套接字
    智能电网短路故障接地故障模拟柜
  • 原文地址:https://blog.csdn.net/shine4869/article/details/134408124