为何统计员工工时的Python函数陷入无限运行无法完成计算?
问题分析与修复
导致无限运行的核心原因
- 遍历对象错误:函数参数是
data,但代码里遍历的是未定义的workshifts;后续还往workshifts里追加元素,会让for循环的列表持续变长,永远无法结束。 - while循环无递增逻辑:
while(start_hour<end_hour)里没有修改start_hour的值,循环条件永远成立,直接陷入死循环。 - 字符串直接比较:
start_hour和end_hour是字符串类型,直接比较会出现逻辑错误(比如'9' > '10'会返回True),必须转成整数再比较。
其他逻辑错误
- 索引计算错误:
work_hours[int(start_hour)-2]会把07点的统计放到索引5的位置,完全错位,应该直接用int(start_hour)作为索引(work_hours[0]对应0点,work_hours[7]对应7点)。 - 跨天处理逻辑混乱:
end_hour==0用字符串判断,且往遍历列表追加元素的操作完全错误。 - 未处理分钟因素:原代码只看小时,忽略了分钟对在岗小时的影响(比如07:30开始,07点应该算在岗;15:10结束,15点也应该算在岗)。
修正后的代码
import numpy as np def count_workhours(data): work_hours = [0] * 24 for row in data: # 拆分排班时间段 start_str, end_str = row.split('-') start_hour, start_min = map(int, start_str.split(':')) end_hour, end_min = map(int, end_str.split(':')) # 处理跨天情况(比如23:00-01:00) if end_hour < start_hour: # 统计当天从start_hour到23点的时间段 for hour in range(start_hour, 24): work_hours[hour] += 1 # 统计次日从0点到end_hour的时间段 for hour in range(0, end_hour): # 若结束分钟为0,说明end_hour不算在岗 if end_min == 0 and hour == end_hour - 1: continue work_hours[hour] += 1 else: # 统计当天的时间段 end_idx = end_hour # 结束时间非整点,结束小时也算在岗 if end_min > 0: end_idx += 1 # 遍历覆盖的所有小时(左闭右开) for hour in range(start_hour, end_idx): if hour >= 24: break work_hours[hour] += 1 return np.array(work_hours)
代码说明
- 统一将时间转成整数类型,避免字符串比较的逻辑错误。
- 用for循环替代while循环,彻底规避死循环风险,逻辑更清晰。
- 支持跨天排班的统计(比如23:00-01:00)。
- 考虑分钟因素:结束时间非整点时,结束小时算在岗(可根据实际需求调整逻辑)。
- 不再修改遍历的原列表,避免循环无限延长。
内容的提问来源于stack exchange,提问作者MaxMad
相关产品推荐
相关产品推荐

