按 python 数据框获取每个移位值组

get each shift values group by python data frame

我正在处理生产分析数据集(Shift-wise one(Day/Night))。白班是早上 7 点到晚上 7 点,夜班是晚上 7 点到早上 7 点。

  1. 有时 白班和夜班可以分为两个或更多部分(例如:早上 7 点到晚上 7 点白班可以是 - 早上 7 点到上午 10 点和上午 10 点-晚上 7 点)。 如果班次分为两个或更多部分,首先需要检查整个班次分区的品牌是否相同。

如果是,设置开始时间为第一个班次开始时间分区的开始,结束时间为最后一个班次结束时间分区的结束。

对于生产:获取轮班分区的总产量

对于 RPM:获取平移部分的平均值

如果否,获取每个品牌的适当值。 (要了解更多信息,请检查预期输出。)

原始数据帧样本:

Start            end            shift   Brand   Production  RPM
7/8/2020 19:00  7/9/2020 7:00   Night   A       10          50
7/9/2020 7:00   7/9/2020 17:07  Day     A       5           50
7/9/2020 17:07  7/9/2020 17:58  Day     A       10          100
7/9/2020 17:58  7/9/2020 19:00  Day     A       5           60
7/9/2020 19:00  7/9/2020 21:30  Night   A       2           10
7/9/2020 21:30  7/9/2020 22:40  Night   B       5           20
7/9/2020 22:40  7/10/2020 7:00  Night   B       5           30
7/10/2020 7:00  7/10/2020 18:27 Day     C       15          20
7/10/2020 18:27 7/10/2020 19:00 Day     C       5           40

预期输出:

Start           end             shift   Brand   Production  RPM
7/8/2020 19:00  7/9/2020 7:00   Night   A       10          50
7/9/2020 7:00   7/9/2020 19:00  Day     A       20          70
7/9/2020 19:00  7/9/2020 21:30  Night   A       2           10
7/9/2020 21:30  7/10/2020 7:00  Night   B       10          25
7/10/2020 7:00  7/10/2020 19:00 Day     C       20          30

提前致谢。

这里有一个建议:

确保列 StartEnd 具有日期时间值(我已将 end 重命名为 End 并将 shift 重命名为 Shift :)):

df['Start'] = pd.to_datetime(df['Start'])
df['End'] = pd.to_datetime(df['End'])

然后

df['Day'] = df['Start'].dt.strftime('%Y-%m-%d')
df = (df.groupby(['Day', 'Shift', 'Brand'])
      .agg(Start = pd.NamedAgg(column='Start', aggfunc='min'),
           End = pd.NamedAgg(column='End', aggfunc='max'),
           Production = pd.NamedAgg(column='Production', aggfunc='sum'),
           RPM = pd.NamedAgg(column='RPM', aggfunc='mean'))
      .reset_index()[df.columns]
      .drop('Day', axis='columns'))

给你

                Start                 End  Shift Brand  Production  RPM
0 2020-07-08 19:00:00 2020-07-09 07:00:00  Night     A          10   50
1 2020-07-09 07:00:00 2020-07-09 19:00:00    Day     A          20   70
2 2020-07-09 19:00:00 2020-07-09 21:30:00  Night     A           2   10
3 2020-07-09 21:30:00 2020-07-10 07:00:00  Night     B          10   25
4 2020-07-10 07:00:00 2020-07-10 19:00:00    Day     C          20   30

这似乎是您想要的输出(如果我没记错的话)。

如果您想将 StartEnd 列转换回格式类似于您上面给出的格式的字符串(有一些额外的填充):

df['Start'] = df['Start'].dt.strftime('%m/%d/%Y %H:%M')
df['End'] = df['End'].dt.strftime('%m/%d/%Y %H:%M')