#python #pandas #dataframe #group-by #average
#питон #панды #фрейм данных #группировать по #среднее
Вопрос:
Я работаю над набором данных производственного анализа (посменно (День / Ночь)). Дневная смена с 7 утра до 7 вечера, а ночная смена с 7 вечера до 7 утра.
- Иногда дневная и ночная смена может быть разделена на две или более части (например, с 7 утра до 7 вечера Дневная смена может быть — с 7 утра до 10 утра и с 10 утра до 7 вечера). Если смены разделены на две или более частей, сначала необходимо проверить, одинакова ли марка для всех разделов смены.
Если ДА, установите время начала в качестве начала раздела времени начала первой смены, а время окончания — в качестве конца раздела времени окончания последней смены.
Для производства: получить общее производство секций смены
Для оборотов в минуту: получить среднее значение долей сдвига
Если нет, получите соответствующие значения для каждого бренда. (Для большего понимания, пожалуйста, проверьте ожидаемый результат.)
Образец необработанного фрейма данных:
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
Заранее благодарю.
Ответ №1:
Вот одно предложение:
Убедитесь, что столбцы 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')