Python Pandas:如何按datetime列分组,仅使用时间并丢弃日期
我有一个带有日期时间列的数据框。我只想按时间成分进行分组和聚合,例如采用平均值 我知道我可以使用pd.gropper按日期和时间分组,但它不能只在时间上工作 假设我们有以下数据帧: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
将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.