Временные ряды Pandas: группировка и сумма с полудня до полудня

#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. Именно то, что я искал. Спасибо!