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

为何统计员工工时的Python函数陷入无限运行无法完成计算?

问题分析与修复

导致无限运行的核心原因

  1. 遍历对象错误:函数参数是data,但代码里遍历的是未定义的workshifts;后续还往workshifts里追加元素,会让for循环的列表持续变长,永远无法结束。
  2. while循环无递增逻辑:while(start_hour<end_hour)里没有修改start_hour的值,循环条件永远成立,直接陷入死循环。
  3. 字符串直接比较: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:48:21