#python-2.7 #pandas
#python-2.7 #pandas
Вопрос:
Мой фрейм данных pandas структурирован следующим образом (с ‘date’ в качестве индекса):
starttime duration_seconds
date
2012-12-24 11:52:00 31800
2012-12-23 0:28:00 35940
2012-12-22 2:00:00 26820
2012-12-21 1:57:00 23520
2012-12-20 1:32:00 23100
2012-12-19 0:50:00 25080
2012-12-18 1:17:00 24780
2012-12-17 0:38:00 25440
2012-12-15 10:38:00 32760
2012-12-14 0:35:00 23160
2012-12-12 22:54:00 3960
2012-12-12 0:21:00 24060
2012-12-10 23:45:00 900
2012-12-11 11:00:00 24840
2012-12-10 0:27:00 25980
2012-12-09 19:29:00 4320
2012-12-09 3:00:00 29880
2012-12-08 2:07:00 34380
Я использую следующее для группирования по дате и суммирования общего количества секунд каждый день:
df_sum = df.groupby(df.index.date).sum()
Что я хотел бы сделать, так это суммировать duration_seconds с полудня одного дня до полудня следующего дня. Есть ли элегантный (pandas) способ сделать это? Заранее спасибо!
Ответ №1:
pd.TimeGrouper
это пользовательский класс groupby для группировки NDFrames по временному интервалу с помощью a DatetimeIndex
, TimedeltaIndex
или PeriodIndex
. (Если ваш индекс фрейма данных использует строки даты, вам нужно сначала преобразовать его в DatetimeIndex с помощью df.index = pd.DatetimeIndex(df.index)
.)
df.groupby(pd.TimeGrouper('24H')).sum()
группы df
с использованием 24-часовых интервалов, начиная с time 00:00:00
.
df.groupby(pd.TimeGrouper('24H'), base=12).sum()
группы df
с использованием 24-часовых интервалов, начиная с time 12:00:00
:
In [90]: df.groupby(pd.TimeGrouper('24H', base=12)).sum()
Out[90]:
duration_seconds
2012-12-07 12:00:00 34380.0
2012-12-08 12:00:00 34200.0
2012-12-09 12:00:00 26880.0
2012-12-10 12:00:00 24840.0
2012-12-11 12:00:00 28020.0
2012-12-12 12:00:00 NaN
2012-12-13 12:00:00 23160.0
2012-12-14 12:00:00 32760.0
2012-12-15 12:00:00 NaN
2012-12-16 12:00:00 25440.0
2012-12-17 12:00:00 24780.0
2012-12-18 12:00:00 25080.0
2012-12-19 12:00:00 23100.0
2012-12-20 12:00:00 23520.0
2012-12-21 12:00:00 26820.0
2012-12-22 12:00:00 35940.0
2012-12-23 12:00:00 31800.0
Документация по pd.TimeGrouper
немного скудная. Это подкласс, pd.Grouper
и поэтому многие его параметры имеют то же значение, что и задокументированные для pd.Grouper
. Вы можете найти больше примеров pd.TimeGrouper
использования в Кулинарной книге. Я нашел base
параметр, просмотрев исходный код. base
Параметр in pd.TimeGrouper
имеет то же значение, base
что и параметр in pd.resample
, и это неудивительно, поскольку pd.resample
реализован с использованием pd.TimeGrouper
.
На самом деле, если подумать, другой способ вычисления желаемого результата
df.resample('24H', base=12).sum()
Комментарии:
1. Именно то, что я искал. Спасибо!