
本文介绍如何使用 python 快速计算从当月1号至今日(含或不含当日)之间已发生的交易日(工作日)数量,支持 numpy 高效方案与纯 python 实现,并说明关键细节与注意事项。
在金融、财务或任务调度等场景中,常需统计“本月已过多少个工作日”(即周一至周五,排除周末及法定节假日),而非自然日数。例如,2024年2月12日(星期一)时,2月1日至12日期间实际有7个完整交易日(2月1日–2日、5日–9日),若包含12日当天则为8个。
✅ 推荐方案:使用 numpy.busday_count
numpy.busday_count 是专为工作日计算设计的高效函数,底层自动跳过周六(5)、周日(6),且支持自定义节假日列表(通过 weekmask 和 holidays 参数):
from datetime import datetime import numpy as np today = datetime.today().date() first_day = today.replace(day=1) # 获取当月1号 # 注意:busday_count(start, end) 计算 [start, end) 区间内工作日数(左闭右开) # 即包含 start 日,不包含 end 日 → 若想包含 today,需将 end 设为 today + 1 天 num_business_days_excl_today = np.busday_count(first_day, today) # 输出:7 num_business_days_incl_today = np.busday_count(first_day, today + timedelta(days=1)) # 输出:8
⚠️ 关键注意:np.busday_count(start, end) 默认采用左闭右开区间 [start, end),因此 busday_count(2024-02-01, 2024-02-12) 统计的是 2月1日(含)至 2月12日(不含)之间的交易日,即截至2月11日。如需包含2月12日当天,请传入 today + timedelta(days=1) 作为结束日期。
? 纯 Python 方案(无需 NumPy)
若项目环境受限无法安装 NumPy,可使用标准库遍历并判断 weekday:
from datetime import datetime, timedelta
today = datetime.today().date()
first_day = today.replace(day=1)
delta_days = (today - first_day).days # 总天数差(0 ~ delta_days-1)
# weekday() 返回 0=周一, 6=周日;< 5 表示周一至周五
num_business_days = sum(
(first_day + timedelta(days=n)).weekday() < 5
for n in range(delta_days + 1) # +1 以包含 today 本身
)此方案默认包含当日(range(delta_days + 1)),结果为 8;若要排除当日,改为 range(delta_days) 即可。
? 补充说明
- 节假日处理:上述两种方法均默认仅排除周末,不识别法定节假日。如需排除春节、国庆等,推荐使用 pandas.bdate_range 或扩展 numpy.busday_count 的 holidays 参数(需提供 np.array 格式的日期序列)。
- 时区与本地化:所有示例基于系统本地日期,若涉及跨时区业务,建议统一转换为 date 对象前先标准化时区(如用 datetime.now(timezone.utc).date())。
- 性能提示:对单次计算,两者差异可忽略;但在高频循环(如批量处理数千日期)中,numpy.busday_count 向量化优势显著。
掌握这两种方法,你即可灵活、准确地实现“本月交易日计数”,为报表生成、KPI统计或自动化调度提供可靠的时间逻辑支撑。










