我不明白如何仅考虑熊猫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')
)
有效,但确实考虑了这一天。
答案 0 :(得分:3)
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