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

如何从班次列表提取D/N班次起止日期并生成对应字典

问题描述

需求规则:

  • 班次为D/N时,需识别连续同类型班次的起止日期;D对应shift_type为S1,N对应S2
  • W班次不计入结果,但需计算其1周的日期跨度,保证后续日期计算准确

给定输入:

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)

待修正代码无法正确识别连续班次并计算日期,期望输出字典列表:

[
    {'shift_type': 'S1', 'start_date': '2021,4,1', 'end_date': '2021,4,4'},
    {'shift_type': 'S2', 'start_date': '2021,4,5', 'end_date': '2021,4,9'},
    {'shift_type': 'S1', 'start_date': '2021,4,11', 'end_date': '2021,4,13'}
]
正确实现方案
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":
        # W班次日期+1周,同时保存之前未结束的连续班次
        current_date += timedelta(weeks=1)
        if current_shift is not None:
            end_date = current_date - timedelta(days=1)
            result.append({
                'shift_type': 'S1' if current_shift == 'D' else 'S2',
                'start_date': f"{start_date.year},{start_date.month},{start_date.day}",
                'end_date': f"{end_date.year},{end_date.month},{end_date.day}"
            })
            current_shift = None
            start_date = None
        continue
    
    # 切换班次时保存上一段连续班次数据
    if shift != current_shift:
        if current_shift is not None:
            end_date = current_date - timedelta(days=1)
            result.append({
                'shift_type': 'S1' if current_shift == 'D' else 'S2',
                'start_date': f"{start_date.year},{start_date.month},{start_date.day}",
                'end_date': f"{end_date.year},{end_date.month},{end_date.day}"
            })
        # 初始化新的连续班次跟踪
        current_shift = shift
        start_date = current_date
    
    # D/N班次日期每日递进
    current_date += timedelta(days=1)

# 处理最后一段未保存的连续班次
if current_shift is not None:
    end_date = current_date - timedelta(days=1)
    result.append({
        'shift_type': 'S1' if current_shift == 'D' else 'S2',
        'start_date': f"{start_date.year},{start_date.month},{start_date.day}",
        'end_date': f"{end_date.year},{end_date.month},{end_date.day}"
    })

# 输出结果
for item in result:
    print(item)
关键逻辑说明
  • 连续班次识别:用current_shift跟踪当前连续班次类型,班次切换时自动保存上一段数据
  • W班次处理:直接累加1周日期,同时中断当前连续班次的跟踪并保存数据
  • 日期格式化:将date对象转换为年,月,日字符串,匹配期望输出格式
  • 收尾处理:循环结束后检查是否有未保存的最后一段连续班次,避免遗漏

内容的提问来源于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:35:13