我已经编写了一些代码来计算完成特定项目中每个里程碑所需的时间(通过从下一行的开始日期中减去前一个结束时间)。
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返回最大时间增量(从当前行的开始时间减去前一个结束时间,再从当前行的开始时间减去前一个err_time之间)。因此,在上面的示例中,由于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返回的最大分钟数是前一个jb_id的上一个项目结束时间和新jb_id的开始时间(而不是返回NaN)的时间增量(因为这是一项新工作) )。
我怀疑解决方案可能涉及使用groupby,然后通过jb_id找到timedeltas groupby?