chinese-calendar 的 is_workday() 总返回 false 的常见原因是未调用 init() 初始化内置节假日数据;必须在项目启动时显式调用 chinese_calendar.init(),否则所有判断基于空日历,且需验证 get_holidays(2024) 返回非空字典。

chinese-calendar 安装后 is_workday() 总返回 False
常见原因是没调用 init() 初始化内置节假日数据。这个库不自动加载,初始化必须显式触发,否则所有判断都基于空日历。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 在项目启动时(如
__main__.py或 Django 的ready())立即调用chinese_calendar.init() - 如果用的是较老版本(init() 需传路径:
chinese_calendar.init('holidays.json');新版默认走内置数据,但依然要调 - 检查是否误用了
chinese_calendar.is_holiday()却传了工作日日期——它只对法定假日返回True,非假日(含周末+调休工作日)都返回False,容易误判
调休日(如周六上班)被当成休息日
库默认只识别国务院发布的放假安排,不自动推导调休规则。比如 2024 年 9 月 29 日(周日)上班,若原始 JSON 数据未包含该日为 "workday": true,is_workday() 就会错判为休息日。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 优先用最新版库(≥1.6),其内置数据已覆盖近年调休安排;可通过
chinese_calendar.__version__确认 - 若仍缺某年调休,手动更新 JSON:从
chinese_calendar.holidays获取当前数据字典,补上缺失的{'2024-09-29': {'workday': True}},再用chinese_calendar.set_holidays()注入 - 别依赖网络实时拉取——该库不提供在线 API,所有数据离线打包,更新靠发版或手动维护
和 pandas Timestamp / datetime.date 混用报 TypeError: expected string or bytes-like object
is_workday() 只接受 str(格式为 'YYYY-MM-DD')或 datetime.date,不支持 pandas.Timestamp 或带时分秒的 datetime.datetime。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 转
date最稳妥:chinese_calendar.is_workday(pd_timestamp.date()) - 转字符串也可,但注意格式:
chinese_calendar.is_workday(pd_timestamp.strftime('%Y-%m-%d')) - 如果批量处理 DataFrame 列,别直接传 Series——得用
.apply(lambda x: chinese_calendar.is_workday(x.date())),否则类型错误会中断整个计算
Django/Flask 启动时初始化失败,提示 FileNotFoundError: holidays.json
这是旧版(≤1.4)行为:尝试从当前目录读 JSON 文件,但包内资源未正确打包。新版已改用 importlib.resources 加载内置数据,不再依赖外部文件。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 升级到
chinese-calendar>=1.6:pip install --upgrade chinese-calendar - 若因环境限制无法升级,临时解法是把项目根目录下的
holidays.json(可从 GitHub releases 下载)路径硬编码进init() - 验证是否生效:打印
chinese_calendar.get_holidays(2024),应返回非空 dict;若为空,说明初始化失败或数据未加载
真正麻烦的不是函数调不起来,而是调起来了却信错了结果——比如把调休日当休息日排班,或者跨年时没刷新缓存导致 1 月 1 日还按去年规则算。数据时效性和初始化时机,比语法细节更值得盯紧。










