У меня есть фрейм данных, который выглядит так:
Я использую python 3.6.5 и объект datetime.time для индекса
print(sum_by_time)
Trips
Time
00:00:00 10
01:00:00 10
02:00:00 10
03:00:00 10
04:00:00 20
05:00:00 20
06:00:00 20
07:00:00 20
08:00:00 30
09:00:00 30
10:00:00 30
11:00:00 30
Как я могу сгруппировать этот фрейм данных по временному интервалу, чтобы получить что-то вроде этого:
Trips
Time
00:00:00 - 03:00:00 40
04:00:00 - 07:00:00 80
08:00:00 - 11:00:00 120
Я думаю, нужно преобразовать значения индекса в timedeltas с помощью to_timedelta
, а затем resample
:
df.index = pd.to_timedelta(df.index.astype(str))
df = df.resample('4H').sum()
print (df)
Trips
00:00:00 40
04:00:00 80
08:00:00 120
Обновлено:
Для вашего формата потребуется:
df['d'] = pd.to_datetime(df.index.astype(str))
df = df.groupby(pd.Grouper(freq='4H', key='d')).agg({'Trips':'sum', 'd':['first','last']})
df.columns = df.columns.map('_'.join)
df = df.set_index(df['d_first'].dt.strftime('%H:%M:%S') + ' - ' + df['d_last'].dt.strftime('%H:%M:%S'))[['Trips_sum']]
print (df)
Trips_sum
00:00:00 - 03:00:00 40
04:00:00 - 07:00:00 80
08:00:00 - 11:00:00 120
Огромное спасибо! Есть идеи, как заставить индекс отражать временные интервалы? т.е. вместо 00:00:00 напишите 00:00:00 - 03:00:00
@Jad - Добавлено решение, проверьте его.
Другой способ извлечения информации о временных интервалах может заключаться в использовании to_period
в индексе и использовании start_time
и end_time
. Тогда не нужно заново разбирать временную строку.
@ Quickbeam2k1 - Хорошая идея, спасибо. Я пытаюсь это реализовать.
Ты подтолкнул меня на это! Вот что я придумал! Только для будущих посетителей вы можете использовать «H» для часа, «T» для минут и «M» для интервалов времени месяца.