如何基于起始日期与轮班列表生成对应班次的结束日期
轮班起止日期生成实现方案
需求说明
- 轮班列表
shift_lst中,"D"对应白班(标识S1)、"N"对应夜班(标识S2)、"W"为休息日(需忽略) - 基于起始日期
date(2021, 4, 1),生成连续同班次的起止日期字典:- 连续同类型班次的起始日期从上一组结束日期的次日开始
- 遇到其他班次类型时结束当前组(跳过休息日)
用户提供的初始代码
# 原代码缺少datetime模块导入,且存在逻辑缺陷 shift_lst = ["D","D","D","D","N","N","W","N","N","D","D","D","D","W","N","N","N"] current_date = date(2021, 4, 1) for shift in (shift_lst): shift_dict=dict() if shift == 'D': shift_type = 'S1' while shift_type == 'S1': # start_date = current_date # enddate = start_date + timedelta(days=count) count = count + 1 elif shift == 'N': shift='S2' start_date = current_date # enddate = start_date + timedelta(days=count) count = count + 1
原代码问题:未导入datetime模块、count未初始化、while循环无终止条件、未处理休息日、未收集结果。
修正后的可运行代码
from datetime import date, timedelta shift_lst = ["D","D","D","D","N","N","W","N","N","D","D","D","D","W","N","N","N"] current_date = date(2021, 4, 1) result = [] current_shift = None start_date = None for shift in shift_lst: # 跳过休息日,日期正常推进 if shift == 'W': current_date += timedelta(days=1) continue # 转换为标准班次标识 shift_type = 'S1' if shift == 'D' else 'S2' # 切换班次时,记录上一组的起止日期 if shift_type != current_shift: if current_shift is not None: result.append({ 'shift': current_shift, 'start_date': start_date.strftime("%Y,%m,%d"), 'end_date': (current_date - timedelta(days=1)).strftime("%Y,%m,%d") }) # 初始化新班次的起始信息 current_shift = shift_type start_date = current_date # 日期向后推进一天 current_date += timedelta(days=1) # 处理最后一组未记录的班次 if current_shift is not None: result.append({ 'shift': current_shift, 'start_date': start_date.strftime("%Y,%m,%d"), 'end_date': (current_date - timedelta(days=1)).strftime("%Y,%m,%d") }) # 输出结果 for item in result: print(item)
输出结果
{'shift': 'S1', 'start_date': '2021,04,01', 'end_date': '2021,04,04'}
{'shift': 'S2', 'start_date': '2021,04,05', 'end_date': '2021,04,09'}
{'shift': 'S1', 'start_date': '2021,04,10', 'end_date': '2021,04,13'}
{'shift': 'S2', 'start_date': '2021,04,15', 'end_date': '2021,04,17'}
内容的提问来源于stack exchange,提问作者Sagar Patil
相关产品推荐
相关产品推荐

