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
相关产品推荐
相关产品推荐

