如何从Pandas日期序列提取周一至周五?求非datetime替代方案
提取工作日日期的两种实用方案
嘿,刚好碰到过类似需求,给你两种靠谱的解决办法:
方案一:基于你现有Pandas代码的优化(推荐)
其实Pandas的date_range本身就支持直接生成周一到周五的工作日序列,不用先生成全量日期再过滤,效率更高:
from datetime import datetime import pandas as pd start = datetime(2018, 3, 4) end = datetime(2018, 3, 17) # 使用freq='B'直接生成工作日序列,B代表Business Day(工作日) workdays = pd.date_range(start, end, freq='B') print(workdays)
如果已经生成了包含周末的全量序列index1,也可以事后过滤,利用日期的weekday属性(0=周一,4=周五,5/6=周末):
# 从已有的index1中筛选工作日 filtered_workdays = index1[index1.weekday < 5] print(filtered_workdays)
方案二:不使用datetime的纯标准库方案
如果不想依赖datetime模块,咱们可以用Python内置的calendar模块手动生成日期并筛选:
import calendar def get_workdays(year, start_month, start_day, end_month, end_day): workdays = [] current_day = start_day current_month = start_month # 循环遍历日期范围 while (current_month, current_day) <= (end_month, end_day): # calendar.weekday返回0=周一,4=周五,符合条件就加入列表 if calendar.weekday(year, current_month, current_day) < 5: workdays.append(f"{year}-{current_month:02d}-{current_day:02d}") # 处理日期进位逻辑 current_day += 1 last_day = calendar.monthrange(year, current_month)[1] if current_day > last_day: current_day = 1 current_month += 1 return workdays # 调用函数获取2018-03-04到2018-03-17的工作日 result = get_workdays(2018, 3, 4, 3, 17) print(result)
这个函数会返回字符串格式的工作日日期,你可以根据需求调整输出格式。
内容的提问来源于stack exchange,提问作者user2644687
相关产品推荐
相关产品推荐

