Как фильтровать и классифицировать с помощью ввода времени и дат

#python #pandas #datetime #if-statement #pivot-table

#python #pandas #дата и время #if-оператор #сводная таблица

Вопрос:

Я новичок в python и пытаюсь решить две проблемы, надеюсь, кто-нибудь сможет мне помочь:

  1. У меня есть данные, один из столбцов которых имеет формат даты:
     Date                Sales

0   2019-07-01 00:00:00 16.66
1   2019-07-01 02:14:00 17.35
2   2019-07-01 03:17:00 28.78
3   2019-07-01 03:25:00 15.65

24765   2020-03-20 23:13:00     33.21
24766   2020-03-20 23:15:00     36.60
24767   2020-03-20 23:17:00     12.33
 

Я хотел создать третий столбец, в котором я определяю, какой сдвиг произошел в продажах:

 From 8:00 to 16:00 - 'First Shift'
From 16:00 to 00:00 - 'Second Shift'
From 00:00 to 08:00 - 'Third Shift'
 
  1. Я хотел создать сумму продаж за день и за смену, результат был бы похож на:
  Day           Shift     Total Sales

2019-07-01     First       $543.23
2019-07-01     Second      $413.87
2019-07-01     Third       $301.12
2020-03-14     Third       $214.13
 

Раньше я работал в Excel, и я пытаюсь преобразовать в python.

В Excel я бы использовал условия if и сводную таблицу, я провел расширенное исследование и пока не смог решить.

Комментарии:

1. Спасибо Ann Zen, я пытался это исправить.

Ответ №1:

Давайте попробуем найти время между и распределить сдвиг. Затем группируйте по дате, сдвигу и сумме в функции agg

 #Set datetime component as index
df.set_index('Date', inplace=True)


#Find time between and allocate shift
df.loc[df.between_time('16:00','00:00').any(1).index,'Shift']='Second Shift'
df.loc[df.between_time('00:00','08:00').any(1).index,'Shift']='Third Shift'
df.loc[df.between_time('08:00','16:00').any(1).index,'Shift']='First Shift'

#Groupby date, shift and sum the sales
df.groupby([df.index.date,'Shift']).agg(TotalSales=('Sales', 'sum'))
 

Альтернативно

 #Create new column Time
df['Date']=pd.to_datetime(df['Date'])
df['Time']=pd.to_datetime(df['Date']).dt.strftime('%H:%M')

#Allocate Shifts using np.select
c=[df.Time.between('00:00','08:00'),df.Time.between('08:00','16:00'),df.Time.between('16:00','23:59')]
choices=['Third Shift','First Shift','Second Shift']

df['Shift']=np.select(c,choices)
#Groupby and sum
df.groupby([df.Date.dt.date,'Shift']).agg(TotalSales=('Sales', 'sum'))
 

Комментарии:

1. В качестве первой альтернативы я получил эту ошибку: индекс должен быть DatetimeIndex, тем не менее, второй вариант работал очень хорошо, и я, наконец, решил свою проблему… Спасибо, я три дня пытаюсь решить эту проблему!!!!

2. Хорошо, первый должен работать, если у вас правильная версия. В любом случае, вы рады принять ответ?

3. Конечно, я! Проблема была решена, и я четко понял, что вы сделали! Спасибо!

Ответ №2:

Попробуйте это:

 #This function converts time to shifts:

def to_shift(hour):
    if hour >= 8 and hour <= 16:        
        return 'First'
    elif hour >= 16 and hour <= 24:
        return 'Second'
    elif hour >= 0 and hour <= 8:
        return 'Third'


df['Time'] = pd.to_datetime(df['Time']) #convert time to a pandas date time if it is already not
df['hour'] = df['Time'].dt.hour #populate a new column with hour
df['date'] = df['Time'].dt.date #populate a new column with date

df['shift'] = df['hour'].apply(to_shift) #apply the to_shift function to each hour in the data set to derive the shift

df_sum = df.groupby(['date', 'shift']).agg({'Sales': 'sum'}) #groupby date and shift to calculate the total sale for the shift and date and populate a new data frame
 

вывод df_sum равен:

 date        shift  Sales    
2019-07-01  Third   78.44
2020-03-20  Second  82.14
 

Комментарии:

1. Я получил следующую ошибку: ‘> =’ не поддерживается между экземплярами ‘str’ и ‘int’

2. Ваш час каким-то образом является str. Не уверен, почему это так, вы могли бы преобразовать это в int; попробуйте hour = int(hour) в качестве первой строки в to_shift