如何按特定列返回timedelta groupby

2024-05-16 20:12:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经编写了一些代码来计算完成特定项目中每个里程碑所需的时间(从下一行的开始日期中减去上一个endtime)

jb_id mlstne_id  strt_tme             end_tme              err_tme   max
166   1511   2019-01-31 07:14:43  2019-01-31 08:36:07        NaT     NaN
166   1515   2019-01-31 08:36:07  2019-01-31 08:38:26        NaT     0.0
166   1518   2019-01-31 12:16:46   NaT           2019-01-31 13:18:40 218.0
166   1520   2019-01-31 13:21:27  2019-01-31 13:30:20        NaT     2.0
166   1524   2019-01-31 13:30:21  2019-01-31 13:34:49 2019-01-31 13:34:49  0.0
167   1530   2019-01-31 13:35:49  2019-01-31 13:36:49        NaT     1.0

Max start返回最大的时间增量(从当前行的开始时间减去上一个结束时间和从当前行的开始时间减去上一个错误时间之间)。看看上面的例子,因为167是一个新的jb_id,最大时间不应该是一分钟,它应该是NaT,因为这是一个新作业的开始

testing = time.sort_values(['jb_id','mlstne_id'], ascending=[True,True])
testing['start1'] = (testing['strt_tme'] - testing['end_tme'].shift(1)).apply(lambda x: x.total_seconds()//60)
testing['start2'] = (testing['strt_tme'] - testing['err_tme'].shift(1)).apply(lambda x: x.total_seconds()//60)
testing['max'] = testing[['start1','start2']].max(axis=1)

我遇到的问题是,每个里程碑都与特定的项目相关联,项目id列表示里程碑属于哪个项目。当我将代码应用于整个数据帧时,每个新项目的第一个mlstne_id返回max minutes,它是前一个jb_id的最后一个项目结束时间和新jb_id的开始时间的时间增量,而不是返回NaN(因为这是一个新作业)

我怀疑解决方案可能涉及使用groupby,然后根据jb_id查找timedelta groupby


Tags: 项目代码id时间nantestingnatmax