Pandas按CODE分组计算当前行DEPART与上一行ARRIVAL的小时差
代码错误原因
- 计算逻辑错误:需求是当前行的DEPART 减去 组内上一行的ARRIVAL,但原代码先计算了同行的DEPART减ARRIVAL,再做整体移位,完全不符合预期计算逻辑。
- 移位作用域错误:原代码的
shift(1)是在groupby.apply返回的全量序列上执行的,没有限制在每个CODE分组内部,会出现前一个分组的最后一行数据和后一个分组第一行数据错位计算的情况,这就是负时间差出现的核心原因。 - 类型不匹配:fillna时使用了字符串类型的
'0',会把整个时间差序列转为object类型,后续无法正常进行单位换算操作。
正确实现代码
核心逻辑是按CODE分组后,将每个组的ARRIVAL列向下移位一行,使上一行的到达时间和当前行的出发时间对齐,再做差值计算即可:
# 分组内移位上一行到达时间 df['PREV_ARRIVAL'] = df.groupby('CODE')['ARRIVAL'].shift(1) # 计算时间差并换算为小时,首行无前置航班填充0 df['LAYOVER'] = (df['DEPART'] - df['PREV_ARRIVAL']).dt.total_seconds() / 3600 df['LAYOVER'] = df['LAYOVER'].fillna(0).round(2) # 可删除临时辅助列 df = df.drop(columns=['PREV_ARRIVAL'])
如果要写一行式也可以直接合并操作:
df['LAYOVER'] = (df['DEPART'] - df.groupby('CODE')['ARRIVAL'].shift(1)).dt.total_seconds().div(3600).fillna(0).round(2)
内容的提问来源于stack exchange,提问作者Prabhu
相关产品推荐
相关产品推荐

