python - 无法对 datetime.time 对象进行 groupby pd.Grouper

标签 python pandas datetime

我不明白如何通过仅考虑 pandas 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')
)

有效,但确实考虑了这一天。

最佳答案

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

关于python - 无法对 datetime.time 对象进行 groupby pd.Grouper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54196534/

相关文章:

具有不同 conda 环境的 Python 任务和 DAG

python - 基于 pandas 中的列的分层条形图

java - 在时区之间转换,即使日期相同(UTC 到 UTC)

java - 获取给定日期的最后一天(日期)

python - 将日期时间格式转换为 Unix 时间戳 Pandas

python - 使用 setuptools 仅安装 .pyc(python 编译)

python - 如何根据Template中对应的alpha channel 像素有选择地对Template和Image Patch像素进行求和?

python - Django 不存在

python - 在给定空单元格的情况下用分隔符分隔单元格

python - Pandas 用 Nan 对两列求和