#python #pandas #datetime #if-statement #pivot-table
#python #pandas #дата и время #if-оператор #сводная таблица
Вопрос:
Я новичок в python и пытаюсь решить две проблемы, надеюсь, кто-нибудь сможет мне помочь:
- У меня есть данные, один из столбцов которых имеет формат даты:
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'
- Я хотел создать сумму продаж за день и за смену, результат был бы похож на:
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