Сгруппируйте и посчитайте количество строк на основе недели
У меня есть следующий пример данных:
Date count_row Work_Type
2018-07-31 00:00:00 1 logpage
2018-08-01 00:00:00 1 logpage
2018-08-01 00:00:00 1 logpage
2018-08-01 00:00:00 1 logpage
2018-08-01 00:00:00 1 logpage
2018-09-02 00:00:00 1 logpage
2018-09-02 00:00:00 1 logpage
2018-09-03 00:00:00 1 logpage
2018-09-04 00:00:00 1 logpage
2018-09-04 00:00:00 1 logpage
2018-09-06 00:00:00 1 logpage
2018-09-07 00:00:00 1 logpage
2018-09-08 00:00:00 1 logpage
Я хочу разбить его на недели и подсчитать количество случаев на этой неделе. В частности, я считаю начало недели понедельником, а конец недели воскресением.
Например, 9/3/2018 - понедельник (или то, что я считаю началом недели). Так что все, что в этот понедельник и в следующее воскресенье я считаю на 9/3/2018.
Ниже приведен результат, который я ищу:
Beginning of Week Date (Mon) count
7/30/2018 5
8/27/2018 2
9/3/2018 6
Я попробовал следующий код:
df.set_index('Date', inplace=True)
df.sort_index(inplace=True)
def take_first(array_like):
return array_like[0]
output = df.resample('W',
how={'Date': take_first,
'count_row': 'sum'},
loffset=pd.offsets.timedelta(days=-6))
Это ошибка, которую я получаю:
IndexError: index out of bounds
2 ответа
Немного времени value_counts
должен решить это:
- Найти смещение даты в днях от начала недели
- Вычтите дельту, чтобы получить начало недели
- Подсчитайте эти значения.
(df.Date.sub(pd.to_timedelta(df.Date.dt.dayofweek, unit='D'))
.value_counts(sort=False))
2018-07-30 5
2018-08-27 2
2018-09-03 6
Name: Date, dtype: int64
Ты можешь использовать resample
:
df.resample('W-Mon', on='Date', label='left', closed='left').sum().query('count_row > 0')
Выход:
count_row
Date
2018-07-30 5
2018-08-27 2
2018-09-03 6