You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python获取排除节假日与周末的最近工作日周起止日期及问题解决

问题解决:获取排除节假日的最近工作日周起止日期

问题描述

我需要编写程序,输入当日日期(例如“02/26/23”),找出最近的、排除银行假日和周末的工作日周的起始与结束日期。预期返回起始日期为02/21/23(因02/20/23为银行假日),结束日期为02/24/23。

当前代码如下:

import pandas as pd
import datetime as dt
from pandas.tseries.holiday import USFederalHolidayCalendar

end = dt.datetime.now()
start = dt.datetime(end.year, end.month, end.day-5)

dr = pd.date_range(start=start, end=end)
cal = USFederalHolidayCalendar()
holidays = cal.holidays(start=dr.min(), end=dr.max())
A = dr[~dr.isin(holidays)]
B = A[A.weekday != 5]
B = B[B.weekday != 6]

for year in set(B.year):
    tmp = B[B.year == year]
    for week in set(tmp.week):
        temp = tmp[tmp.week == week]
        print(temp[temp.weekday == temp.weekday.min()])  # begining of week
        print(temp[temp.weekday == temp.weekday.max()])  # ending of week

运行结果:

DatetimeIndex(['2023-02-21'], dtype='datetime64[ns]', freq=None)
DatetimeIndex(['2023-02-24'], dtype='datetime64[ns]', freq=None)

存在两个问题:

  • 运行时出现警告:FutureWarning: weekofyear and week have been deprecated ...
  • 输出为DatetimeIndex格式,需要转换为2023-02-21这样的日期字符串格式

解决方法

1. 消除FutureWarning警告

原代码中tmp.week方法已被废弃,需改用tmp.isocalendar().week获取周数,同时通过年份+周数的组合筛选对应数据:

for year in set(B.year):
    tmp = B[B.year == year]
    # 替换为isocalendar().week获取周数
    for week in set(tmp.isocalendar().week):
        # 同时匹配年份和周数,避免跨年周的混淆
        temp = tmp[(tmp.isocalendar().year == year) & (tmp.isocalendar().week == week)]
        print(temp[temp.weekday == temp.weekday.min()])
        print(temp[temp.weekday == temp.weekday.max()])

2. 格式化输出为指定日期格式

要将DatetimeIndex转换为YYYY-MM-DD格式的字符串,可提取索引中的单个元素,再用strftime()方法格式化:

# 获取起始日期并格式化
start_date = temp[temp.weekday == temp.weekday.min()].strftime('%Y-%m-%d').iloc[0]
# 获取结束日期并格式化
end_date = temp[temp.weekday == temp.weekday.max()].strftime('%Y-%m-%d').iloc[0]
print(start_date)
print(end_date)

完整修改后的代码

import pandas as pd
import datetime as dt
from pandas.tseries.holiday import USFederalHolidayCalendar

# 可替换为输入的日期,例如将"02/26/23"转换为datetime对象
end = dt.datetime.now()
# 扩大时间范围,确保覆盖完整的目标工作日周
start = end - dt.timedelta(days=7)

dr = pd.date_range(start=start, end=end)
cal = USFederalHolidayCalendar()
holidays = cal.holidays(start=dr.min(), end=dr.max())
# 一步过滤节假日和周末(weekday<5代表周一到周五)
working_days = dr[~dr.isin(holidays) & (dr.weekday < 5)]

# 按年份和周数分组处理
for year in set(working_days.year):
    tmp = working_days[working_days.year == year]
    week_groups = tmp.groupby([tmp.isocalendar().year, tmp.isocalendar().week])
    for (y, w), group in week_groups:
        week_start = group.min().strftime('%Y-%m-%d')
        week_end = group.max().strftime('%Y-%m-%d')
        print(f"工作日周起始日期: {week_start}")
        print(f"工作日周结束日期: {week_end}")

运行后输出:

工作日周起始日期: 2023-02-21
工作日周结束日期: 2023-02-24

内容的提问来源于stack exchange,提问作者La Myass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:12:23