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

如何基于起始日期与轮班列表生成对应班次的结束日期

轮班起止日期生成实现方案

需求说明

  • 轮班列表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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:15:37