




本文介绍如何使用 python 快速计算从当月1号至今日(含或不含当日)之间已发生的交易日(工作日)数量,支持 numpy 高效方案与纯 python 实现,并说明关键细节与注意事项。
在金融、财务或任务调度等场景中,常需统计“本月已过多少个工作日”(即周一至周五,排除周末及法定节假日),而非自然日数。例如,2025年2月12日(星期一)时,2月1日至12日期间实际有7个完整交易日(2月1日–2日、5日–9日),若包含12日当天则为8个。
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(2025-02-01, 2025-02-12) 统计的是 2月1日(含)至 2月12日(不含)之间的交易日,即截至2月11日。如需包含2月12日当天,请传入 today + timedelta(days=1) 作为结束日期。
若项目环境受限无法安装 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) 即可。
掌握这两种方法,你即可灵活、准确地实现“本月交易日计数”,为报表生成、KPI统计或自动化调度提供可靠的时间逻辑支撑。