Python判断指定日期是不是中国工作日/节假日

2023-10-27

判断一个日期是否为工作日、节假日,有一个现成的库函数chinesecalendar

chinesecalendar · PyPI

1、安装与升级

1.1 安装

pip3 install chinesecalendar

1.2 升级

pip install -U chinesecalendar

官方库说明:GitHub - LKI/chinese-calendar: 判断一天是不是法定节假日/法定工作日(查看节假日安排)

由于次年的节假日安排,取决于国务院发布的日程。 所以本项目一般会在国务院更新以后,发布新的版本。 按照以往的经验,一般是每年的 11月 前后发布新版本。

啥意思呢?明年的节假日现在还拿不到,只有等到当年的11月左右才能拿到,这个库对应会升级,也就是需要用户每年手动更新下这个库。(生产环境慎用)

2、代码示例 

demo.py

from logzero import logger
from datetime import datetime
from chinese_calendar import is_workday


def isWorkdays(date_value):
  """
  # 判断是否是法定节假日
  """
  if is_workday(date_value):
    print("{}是工作日".format(date_value))
  else:
    print("{}是休息日".format(date_value))


# 当前日期
date_1 = datetime.now().date()
print("date_1: {}, type: {}".format(date_1, type(date_1)))

isWorkdays(date_1)

# 人工输入日期
date_2 = datetime.strptime("2022-03-19", '%Y-%m-%d').date()
print("date_2: {}, type: {}".format(date_2, type(date_2)))

isWorkdays(date_2)


# 2、获取上一个工作日
def get_last_work_day(time_day):
    """
    # 获取上一个工作日
    """
    last_worker_day = ""
    
    # 最多查询20次
    query_time = 0
    
    while True:
        time_day = time_day - timedelta(days=1)
        
        if is_workday(time_day):
            last_worker_day = time_day.strftime("%Y-%m-%d")
            break
        elif query_time > 20:
            break
        
        query_time += 1
            
    return last_worker_day


# 日期
time_day = date.today()

# 判断是工作日
if is_workday(time_day):
    logger.info("{}是工作日!".format(time_day))
else:
    logger.info("{}不是工作日!".format(time_day))
    
last_work_day = get_last_work_day(time_day)
logger.info("上一个工作日是: {}".format(last_work_day))

运行结果:

date_1: 2022-02-18, type: <class 'datetime.date'>
2022-02-18是工作日
date_2: 2022-03-19, type: <class 'datetime.date'>
2022-03-19是休息日

3、注意事项

这个库生产环境下使用得注意,如果使用的是一个老版本的库,只能判断当年所在的日期是不是工作,等到第二年,可能就不行,这个时候首先检查下最新版本的库支不支持,检查方法如下:

2022年安装的库版本:chinesecalendar  1.6.1(查看方式: pip3 list | grep chinesecalendar)

在未更新库的情况下,2023年执行时候报错,可以明显的看出报错信息"NotImplementedError: no available data for year 2023, only year between [2004, 2022] supported"。

# 进入Python3终端环境测试


>>> from chinese_calendar import is_workday
>>>
>>> from datetime import datetime, date
>>> today = date.today()
>>> today
datetime.date(2023, 3, 15)
>>>
>>> is_workday(today)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/sokf/.jumbo/lib/python3.6/site-packages/chinese_calendar/utils.py", line 60, in is_workday
    date = _validate_date(date)
  File "/home/sokf/.jumbo/lib/python3.6/site-packages/chinese_calendar/utils.py", line 36, in _validate_date
    "no available data for year {}, only year between [{}, {}] supported".format(date.year, min_year, max_year)
NotImplementedError: no available data for year 2023, only year between [2004, 2022] supported
>>>

更新为最新的库,最新版本:1.8.0(当前时间:2023.3.15)

# 更新方式
$ pip3 install chinesecalendar -U


# 查看当前版本
$ pip3 list | grep chinesecalendar
chinesecalendar           1.8.0

再次尝试:

>>> from chinese_calendar import is_workday
>>> from datetime import datetime, date
>>> today = date.today()
>>> today
datetime.date(2023, 3, 15)
>>> is_workday(today)
True

我们接着再看着这个库支持的时间范围,可以模拟使用一个几年后的日期作为输入,可以看出此时(2023.3.15)提示这个库只能支持到2023年的判断。

>>> from chinese_calendar import is_workday
>>> from datetime import datetime, date, timedelta
>>> today = datetime.now() + timedelta(days=1365)
>>> is_workday(today)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/sokf/.jumbo/lib/python3.6/site-packages/chinese_calendar/utils.py", line 61, in is_workday
    date = _validate_date(date)
  File "/home/sokf/.jumbo/lib/python3.6/site-packages/chinese_calendar/utils.py", line 37, in _validate_date
    "no available data for year {}, only year between [{}, {}] supported".format(date.year, min_year, max_year)
NotImplementedError: no available data for year 2026, only year between [2004, 2023] supported

参考:

python判断工作日,节假日 - 肖祥 - 博客园

免费节假日 API - 提莫的神秘小站 (这种方式也可以参考下,不过在我们公司内部的IDC机器上好像访问不通)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python判断指定日期是不是中国工作日/节假日 的相关文章

随机推荐

  • NDK开发(一)————如何在Android Studio下进行NDK开发

    在AS中进行NDK开发之前 我们先来简单的介绍几个大家都容易搞懵的概念 1 到底什么是JNI 什么是NDK 2 何为 交叉编译 先看什么是JNI JNI的全称就是Java Native Interface 即java本地开发接口 可能大家和
  • CTex写数学论文的最简教程

    高手不要看下去了 全是傻瓜式的初步指导 想学的人最好先从本文入手 因为大部分教程都在给你讲latex的原理 什么原理 我就是想写篇论文而已嘛 以后遇见问题具体再学 一口学会再去做是白扯 记得使用百度谷歌和ctex论坛解决问题 1 安装cte
  • Redis哨兵模式(Sentinel)

    哨兵模式 概述 主从切换技术的操作是 当主机宕机后 需要手动把一台从机切换为主机 这就需要人工干预 费事费力 还会造成一段时间内服务不可用 这不是一种推荐的方式 更多时候 我们优先考虑哨兵模式 Redis 从 2 8 开始正式提供了 Sen
  • c++ interview

    数据结构篇 判断单链表是否有环 单链表排序 两个链表合并后仍然有序 网络编程 五层网络架构 tcp和udp的区别 流量控制和拥塞控制 upd通信流程 udp如何实现可靠传输 进程线程篇 多线程如何同步 进程和线程的区别 进程间的通讯方式 并
  • SVM和Softmax分类器比较

    参考 作者 啊噗不是阿婆主 来源 CSDN 原文 https blog csdn net weixin 38278334 article details 83002748 1 SVM和Softmax分类器是最常用的两个分类器 Softmax
  • Centos7.5设置登录欢迎信息-网络系统管理赛项

    由于2022年网络系统管理赛项的修改加之网上的关于这方面的资料以及博客较少 于是我打算写一篇关于Centos7 5设置登录欢迎信息的博客 准备工作 安装Centos7 5并且安装ssh服务的虚拟机一台 1 编写动态脚本 因为单纯修改 etc
  • wget 使用技巧

    wget 是一个命令行的下载工具 对于我们这些 Linux 用户来说 几乎每天都在使用它 下面为大家介绍几个有用的 wget 小技巧 可以让你更加高效而灵活的使用 wget wget r np nd http example com pac
  • 程序编码风格要求

    程序编码风格包括如下要求 使用好程序内部的文档 为了提高程序的可维护性 源代码也需要实现文档化 标识符要见名知意 要有适当的程序注释 注释分为序言性注释和功能性注释 序言性注释通常置于每个程序模块开 头的部分 给出程序的整体说明 功能性注释
  • 【华为OD机试】-2023(B卷)真题【c++,java,python】

    2023B卷 序号 题目分数 时间 1补种未成活胡杨100 2路灯照明问题100 3敏感字段加密100 2023B卷 4阿里巴巴找黄金宝箱 1 100 2023B卷 5喊7的次数重排1002023B卷 6斗地主之顺子1002023B卷 7I
  • 【错误】Description Resource Path Location

    为什么80 的码农都做不了架构师 gt gt gt 警告 Description Resource Path Location Type Projects must be referenced by an EAR or a WAR to u
  • 【opencv】中值滤波代码分析及优化

    最近用opencv做项目 也在研究opencv源码 发现它中值滤波的性能达不到项目的要求 就想办法优化 本文先解析opencv的中值滤波源码 然后针对滤波核尺寸为7和9的情况进行优化 opencv源码分析 opencv4 7 0实现中值滤波
  • inline内联函数总结

    inline只是对编译器的一个申请 不是强制命令 优点 1 比宏的坑少 而且减少函数调用所招致的额外开销 缺点 1 有可能使目标代码增加 减少了高速缓存的命中率 如果编译器针对 函数本身 所产出的码可能比针对 函数调用 所产出的码更小 果真
  • cesium for ue->CesiumGeospatial

    共32个文件 4257行代码 含注释 截至2022年11月26日 剩余23个文件 3162行代码 截至2022年11月27日 剩余19个文件 2671行代码 截至2022年11月28日 剩余17个文件 2438行代码 截至2022年11月2
  • react-router源码

    1 Router js Router js模块用于监听hashChange popState事件 通过当前页面url更新Router组件的state state形式为 location routes params components 其中
  • SQLi-LABS Less-18到Less-22 头部注入

    Less 18题目 先抓包 由它题目可以知道 这是头部注入 其实我也并不知道头部注入这个姿势 刚好做这道题让我了解一下 在百度过后 头部注入的话已经不能在用户名以及密码那输入SQL语句了 只能通过抓包改包看回显了 这里使用你在Less 17
  • BOSE在上海发布6款音频新品;轩尼诗全球首家概念酒吧在上海开幕

    今日看点 2020 BOSE音频新品发布会在上海举行 此次发布会总共发布了6款产品 包括Bose 消噪耳塞 Bose无线耳塞 Bose 智能音频眼镜 猫眼款和运动款 Bose 遮噪睡眠耳塞 II QC 35 II GAMING HEADSE
  • Shell基础:批量运行程序

    创建可执行程序 文件名 hello c include
  • 将eclipse项目导入idea

    首相我们需要明白idea的两个概念 在idea中project相当于eclipse的workspace 在idea中project相当于eclipse的project 所有首先我们需要新建一个在idea中创建一个project 点击菜单fi
  • 标签
  • 引起的缩进问题 list-style: none outside none;
  • 一般网站css都有相应的初始化部分 最近遇到一个棘手问题 li 标签里面的东西 在firefox下正常 而在ie6全部被缩进 而初始化的部分css也有 list style none 并且这个li没有相应的id或者class 那么是被什么控
  • Python判断指定日期是不是中国工作日/节假日

    判断一个日期是否为工作日 节假日 有一个现成的库函数 chinesecalendar chinesecalendar PyPI 1 安装与升级 1 1 安装 pip3 install chinesecalendar 1 2 升级 pip i