Использование grouper для группировки метки времени в определенном диапазоне

#pandas #timestamp #pandas-groupby

#pandas #временная метка #pandas-groupby

Вопрос:

Предположим, что у меня есть фрейм данных (DF). Индексом этого фрейма данных является временная метка с 11 утра до 18 вечера каждый день, и этот фрейм данных содержит 30 дней. Я хочу группировать ее каждые 30 минут. Это функция, которую я использую:

 out = DF.groupby(pd.Grouper(freq='30min'))
  

Дата начала вывода верна, но для группировки требуется целый день (24 часа). Например, в новой временной метке у меня есть что-то вроде этого:

 11:00:00
11:30:00
12:00:00
12:30:00
...
18:00:00
18:30:00
...
23:00:00
23:30:00
...
2:00:00
2:30:00
...
...
10:30:00
11:00:00
11:30:00
  

В результате многие выходные данные пусты, потому что с 18:00 вечера до 11 утра у меня нет никаких данных.

Комментарии:

1. Можете ли вы добавить какой-нибудь образец данных? Можете ли вы объяснить, 24h что такое группировка, если freq='30min' ?

2. Результат правильный и соответствует ожиданиям. Если вы не хотите сохранять пустые интервалы, просто отфильтруйте их впоследствии.

3. @JohnSloper Есть ли какой-нибудь способ справиться с этим в groupby ?

Ответ №1:

Одним из возможных решений должно быть DatetimeIndex.floor :

 out = DF.groupby(DF.index.floor('30min'))
  

Или используйте dropna после агрегатной функции:

 out = DF.groupby(pd.Grouper(freq='30min')).mean().dropna()
  

Комментарии:

1. Я использую pandas v. 1.1.2, поэтому ваш ответ упростил мне жизнь, но я вижу решение в версии 1.2.0 с новой опцией: «dropna bool, значение по умолчанию True, если True, и если ключи группы содержат значения NA, значения NA вместе со строкой / столбцом будут удалены. Если значение False, значения NA также будут обрабатываться как ключ в группах.»

Ответ №2:

Как упоминалось в комментарии к исходному сообщению, это соответствует ожиданиям. Если вы хотите удалить пустые группы, просто нарежьте их впоследствии. Предполагая, что в этом случае вы используете count для агрегирования:

 df = df.groupby(pd.Grouper(freq='30min')).count()
df = df[df > 0]