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

如何避免新增仅出现一次的操作时触发KeyError

解决单条记录Operation触发KeyError的问题

原代码的核心问题

  1. 全局Shift逻辑错误:原代码对整个DataFrame执行shift(-1),会错误地将不同工序的记录关联计算间隙,导致跨工序的无效间隙被纳入计算。
  2. 单记录处理缺失:当某工序仅存在一条记录时,若该记录位于DataFrame末尾,shift(-1)后start列变为NaN,计算间隙时得到NaN,idxmax()返回NaN,进而触发KeyError: nan。

修正后的代码

import pandas as pd

data = [
  {'order': 1, 'operation': 'milling', 'start': 0, 'end': 70},
  {'order': 1, 'operation': 'milling', 'start': 200, 'end': 210},
  {'order': 1, 'operation': 'milling', 'start': 500, 'end': 600},
  {'order': 1, 'operation': 'grinding', 'start': 90, 'end': 150},
  {'order': 2, 'operation': 'grinding', 'start': 150, 'end': 170},
  {'order': 3, 'operation': 'grinding', 'start': 400, 'end': 420},
  {'order': 3, 'operation': 'milling', 'start': 610, 'end': 660},
  {'order': 4, 'operation': 'new_operation', 'start': 100, 'end': 200}  # 新增单条记录
]

df = pd.DataFrame(data)

def calculate_max_gap(group):
    # 组内按时间排序,保证间隙计算的顺序正确性
    sorted_group = group.sort_values('start').reset_index(drop=True)
    # 仅在当前工序组内执行shift,获取下一道工序的开始时间
    sorted_group['next_start'] = sorted_group['start'].shift(-1)
    # 计算相邻工序的间隙
    sorted_group['gap'] = sorted_group['next_start'] - sorted_group['end']
    
    # 处理单记录情况:若只有一条工序,无间隙,max_gap设为None(可改为0)
    if len(sorted_group) == 1:
        return pd.Series({
            'operation': group.name,
            'max_gap': None,
            'gap_start': None,
            'gap_end': None
        })
    
    # 多记录时获取最大间隙及对应的起止时间
    max_gap_idx = sorted_group['gap'].idxmax()
    return pd.Series({
        'operation': group.name,
        'max_gap': sorted_group['gap'].iloc[max_gap_idx],
        'gap_start': sorted_group['end'].iloc[max_gap_idx],
        'gap_end': sorted_group['next_start'].iloc[max_gap_idx]
    })

# 按工序分组计算最大间隙
result = df.groupby('operation').apply(calculate_max_gap).reset_index(drop=True)
print(result)

运行输出

operation  max_gap  gap_start  gap_end
0      grinding    230.0      170.0    400.0
1       milling    290.0      210.0    500.0
2  new_operation     None        None      None

自定义调整

如果希望单条记录的max_gap显示为0而非None,只需修改函数内的单记录处理逻辑:

if len(sorted_group) == 1:
    return pd.Series({
        'operation': group.name,
        'max_gap': 0,
        'gap_start': None,
        'gap_end': None
    })

内容的提问来源于stack exchange,提问作者question12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:33:19