Python Pandas:如何按datetime列分组,仅使用时间并丢弃日期

Python Pandas:如何按datetime列分组,仅使用时间并丢弃日期,python,pandas,datetime,pandas-groupby,Python,Pandas,Datetime,Pandas Groupby,我有一个带有日期时间列的数据框。我只想按时间成分进行分组和聚合,例如采用平均值 我知道我可以使用pd.gropper按日期和时间分组,但它不能只在时间上工作 假设我们有以下数据帧: 将numpy导入为np 作为pd进口熊猫 drange=pd.日期范围('2019-08-01 00:00','2019-08-12 12:00',频率'1T') 时间=drange.time c0=np.rand.rand(len(drange)) c1=np.rand.rand(len(drange)) df=p

我有一个带有日期时间列的数据框。我只想按时间成分进行分组和聚合,例如采用平均值

我知道我可以使用pd.gropper按日期和时间分组,但它不能只在时间上工作

假设我们有以下数据帧:

将numpy导入为np
作为pd进口熊猫
drange=pd.日期范围('2019-08-01 00:00','2019-08-12 12:00',频率'1T')
时间=drange.time
c0=np.rand.rand(len(drange))
c1=np.rand.rand(len(drange))
df=pd.数据帧(dict(drange=drange,time=time,c0=c0,c1=c1))
打印(df.head())
在这种情况下,以下命令会引发TypeError:

gropper=pd.gropper(key='time',freq='5T')
grouped=df.groupby(grouper.mean)()
我可以将
key=drange
设置为按日期和时间分组,然后:

  • 重置索引
  • 将新列转换为float
  • 带pd切割的料仓
  • 回到过去
  • 最后分组,然后聚合

。。。但是我想知道是否有更干净的方法来实现相同的结果。

Series.dt.time
/
DatetimeIndex.time
将时间返回为
datetime.time
。这不是很好,因为pandas最适合
timedelta64
,因此您的
'time'
列被强制转换到
对象
,失去了所有的datetime功能

您可以从标准化日期中减去时间,以
timedelta
的形式获得时间,因此您可以继续使用pandas的
datetime
工具。您可以
floor
将此分组

s = (df.drange - df.drange.dt.normalize()).dt.floor('5T')

df.groupby(s).mean()


或者,如果您不确定
楼层
,这将获得索引名之前的相同输出

df['time'] = (df.drange - df.drange.dt.normalize())  # timedelta64[ns]
df.groupby(pd.Grouper(key='time', freq='5T')).mean()

Series.dt.time
/
DatetimeIndex.time
将时间返回为
datetime.time
。这不是很好,因为pandas最适合
timedelta64
,因此您的
'time'
列被强制转换到
对象
,失去了所有的datetime功能

您可以从标准化日期中减去时间,以
timedelta
的形式获得时间,因此您可以继续使用pandas的
datetime
工具。您可以
floor
将此分组

s = (df.drange - df.drange.dt.normalize()).dt.floor('5T')

df.groupby(s).mean()


或者,如果您不确定
楼层
,这将获得索引名之前的相同输出

df['time'] = (df.drange - df.drange.dt.normalize())  # timedelta64[ns]
df.groupby(pd.Grouper(key='time', freq='5T')).mean()

使用
DataFrame.groupby
时,您可以。此外,如果序列是日期时间,则可以使用
series.dt
访问日期的属性。在您的情况下,
df['drange'].dt.hour
df['drange'].dt.time
应该可以

# df['drange']=pd.to_datetime(df['drange'])
df.groupby(df['drange'].dt.hour).agg(...)

使用
DataFrame.groupby
时,您可以。此外,如果序列是日期时间,则可以使用
series.dt
访问日期的属性。在您的情况下,
df['drange'].dt.hour
df['drange'].dt.time
应该可以

# df['drange']=pd.to_datetime(df['drange'])
df.groupby(df['drange'].dt.hour).agg(...)

回答得很好!:)+回答得真好。所有建议在几秒钟内操作的方法都很好,但它们失去了在大熊猫身上使用日期的价值+1伟大的答案!:)+回答得真好。所有建议在几秒钟内操作的方法都很好,但它们失去了在大熊猫身上使用日期的价值+1.