#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]