无法对datetime.time对象的pd.Grouper分组

时间:2019-01-15 09:59:53

标签: python pandas datetime

我不明白如何仅考虑熊猫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 :(得分:3)

pandas中的

time是python对象,因此不能与Grouper一起使用。可能的解决方案是选择时间进行拆分,并通过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,请使用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