如何从班次列表提取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
相关产品推荐
相关产品推荐

