按 python 数据框获取每个移位值组
get each shift values group by python data frame
我正在处理生产分析数据集(Shift-wise one(Day/Night))。白班是早上 7 点到晚上 7 点,夜班是晚上 7 点到早上 7 点。
- 有时 白班和夜班可以分为两个或更多部分(例如:早上 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
提前致谢。
这里有一个建议:
确保列 Start
和 End
具有日期时间值(我已将 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
这似乎是您想要的输出(如果我没记错的话)。
如果您想将 Start
和 End
列转换回格式类似于您上面给出的格式的字符串(有一些额外的填充):
df['Start'] = df['Start'].dt.strftime('%m/%d/%Y %H:%M')
df['End'] = df['End'].dt.strftime('%m/%d/%Y %H:%M')
我正在处理生产分析数据集(Shift-wise one(Day/Night))。白班是早上 7 点到晚上 7 点,夜班是晚上 7 点到早上 7 点。
- 有时 白班和夜班可以分为两个或更多部分(例如:早上 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
提前致谢。
这里有一个建议:
确保列 Start
和 End
具有日期时间值(我已将 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
这似乎是您想要的输出(如果我没记错的话)。
如果您想将 Start
和 End
列转换回格式类似于您上面给出的格式的字符串(有一些额外的填充):
df['Start'] = df['Start'].dt.strftime('%m/%d/%Y %H:%M')
df['End'] = df['End'].dt.strftime('%m/%d/%Y %H:%M')