получите каждую группу значений сдвига по фрейму данных python

#python #pandas #dataframe #group-by #average

#питон #панды #фрейм данных #группировать по #среднее

Вопрос:

Я работаю над набором данных производственного анализа (посменно (День / Ночь)). Дневная смена с 7 утра до 7 вечера, а ночная смена с 7 вечера до 7 утра.

  1. Иногда дневная и ночная смена может быть разделена на две или более части (например, с 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')