Невозможно сгруппировать pd.Grouper для объекта datetime.time - PullRequest
0 голосов
/ 15 января 2019

Я не понимаю, как группировать, учитывая только время в панде DataFrame.

MWE:

import pandas as pd

df = (
    pd.DataFrame({'date': ['2018-01-01 12:10:00', '2018-01-02 12:11:00']})
    .assign(
        date=lambda df: df.date.astype('datetime64').dt.time,
        foo='bar',
    )
    .groupby(pd.Grouper(key='date', freq='10T'))
    .agg('count')
)
# throws TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'

df = (
    pd.DataFrame({'date': ['2018-01-01 12:10:00', '2018-01-02 12:11:00']})
    .assign(
        date=lambda df: df.date.astype('datetime64'),
        foo='bar',
    )
    .groupby(pd.Grouper(key='date', freq='10T'))
    .agg('count')
)

работает, но учитывает день.

1 Ответ

0 голосов
/ 15 января 2019

time в пандах - это объект python, поэтому не работает с Grouper. Возможное решение - выбрать время с разбивкой и преобразовать в timedeltas на to_timedelta или преобразовать в to_datetime - получить одинаковые даты, потому что datetime всегда содержит date:

df = (
    pd.DataFrame({'date': ['2018-01-01 12:10:00', '2018-01-02 12:11:00']})
    .assign(date=lambda df: pd.to_timedelta(df.date.str.split().str[1]))
    .groupby(pd.Grouper(key='date', freq='10T'))
    .size()
)
print (df)

date
12:10:00    2
Freq: 10T, dtype: int64

Или:

df = (
    pd.DataFrame({'date': ['2018-01-01 12:10:00', '2018-01-02 12:11:00']})
    .assign(date=lambda df: pd.to_datetime(df.date.str.split().str[1]))
    .groupby(pd.Grouper(key='date', freq='10T'))
    .size()
)
print (df)

date
2019-01-15 12:10:00    2
Freq: 10T, dtype: int64

Если входной столбец имеет datetime dtype, используйте strftime для преобразования в строки:

df = (
    pd.DataFrame({'date': pd.to_datetime(['2018-01-01 12:10:00', '2018-01-02 12:11:00'])})
    .assign(date=lambda df: pd.to_datetime(df.date.dt.strftime('%H:%M:%S')))
    .groupby(pd.Grouper(key='date', freq='10T'))
    .size()
)
print (df)
date
2019-01-15 12:10:00    2
Freq: 10T, dtype: int64

Или:

df = (
    pd.DataFrame({'date': pd.to_datetime(['2018-01-01 12:10:00', '2018-01-02 12:11:00'])})
    .assign(date=lambda df: pd.to_datetime(df.date.dt.time.astype(str)))
    .groupby(pd.Grouper(key='date', freq='10T'))
    .size()
)
print (df)
date
2019-01-15 12:10:00    2
Freq: 10T, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...