Pandas对datetime列使用groupby transform计算分组时间差
错误原因
你的代码存在两处核心问题:
transform方法要求传入可在分组对象上执行的计算逻辑,你直接传入了全局范围计算的max(df['Hour'])-min(df['Hour']),得到的是整个数据集的时间差,不是分组内的计算结果- 时间做差得到的是timedelta类型,无法直接作为数值使用,需要手动转换为小时单位的数值
正确实现代码
如果Hour列还未转为datetime类型,先做类型转换,再通过分组变换计算组内时间差:
import pandas as pd # 转datetime类型,已完成可跳过 df['Hour'] = pd.to_datetime(df['Hour']) # 按Day、Name分组计算组内最大最小时间的小时差 df['Delay'] = df.groupby(['Day', 'Name'])['Hour'].transform( lambda col: (col.max() - col.min()).total_seconds() / 3600 )
执行后得到的结果完全匹配预期:
Day Name Hour Delay 1 M John 2024-xx-xx 10:00:00 4.0 2 M John 2024-xx-xx 11:00:00 4.0 3 M John 2024-xx-xx 14:00:00 4.0 4 T Maria 2024-xx-xx 20:00:00 2.5 5 T Maria 2024-xx-xx 22:30:00 2.5
如果需要对整数结果做格式化,可以根据需求做类型转换,由于存在2.5这类非整数小时值,默认保留浮点类型即可。
内容的提问来源于stack exchange,提问作者Movilla
相关产品推荐
相关产品推荐

