我有一个日期时间列的dataframe。我只想按时间组成进行分组,并进行汇总,例如取平均值。
我知道我可以使用pd.Grouper按日期和时间分组,但它不只是准时工作。
假设我们有以下数据:
import numpy as np
import pandas as pd
drange = pd.date_range('2019-08-01 00:00', '2019-08-12 12:00', freq='1T')
time = drange.time
c0 = np.random.rand(len(drange))
c1 = np.random.rand(len(drange))
df = pd.DataFrame(dict(drange=drange, time=time, c0=c0, c1=c1))
print(df.head())
drange time c0 c1
0 2019-08-01 00:00:00 00:00:00 0.031946 0.159739
1 2019-08-01 00:01:00 00:01:00 0.809171 0.681942
2 2019-08-01 00:02:00 00:02:00 0.036720 0.133443
3 2019-08-01 00:03:00 00:03:00 0.650522 0.409797
4 2019-08-01 00:04:00 00:04:00 0.239262 0.814565
在本例中,以下内容引发一个TypeError:
grouper = pd.Grouper(key='time', freq='5T')
grouped = df.groupby(grouper).mean()
我可以将key=drange
设置为按日期和时间分组,然后:
..。但我不知道是否有更清洁的方法来取得同样的结果。
发布于 2019-10-09 07:45:04
Series.dt.time
/DatetimeIndex.time
以datetime.time
的形式返回时间。这并不好,因为熊猫在timedelta64
中工作得最好,所以您的'time'
列被转换为object
,失去了所有的日期时间功能。
您可以减去规范化日期,以获得作为timedelta
的时间,这样您就可以继续使用熊猫的datetime
工具。您可以通过floor
将其分组。
s = (df.drange - df.drange.dt.normalize()).dt.floor('5T')
df.groupby(s).mean()
c0 c1
drange
00:00:00 0.436971 0.530201
00:05:00 0.441387 0.518831
00:10:00 0.465008 0.478130
... ... ...
23:45:00 0.523233 0.515991
23:50:00 0.468695 0.434240
23:55:00 0.569989 0.510291
或者,如果您对floor
不确定,这将获得与索引名称相同的输出。
df['time'] = (df.drange - df.drange.dt.normalize()) # timedelta64[ns]
df.groupby(pd.Grouper(key='time', freq='5T')).mean()
发布于 2019-10-09 07:47:42
当您使用DataFrame.groupby
时,您可以使用系列论证。此外,如果您的系列是datetime,则可以使用series.dt
访问date的属性。在您的例子中,df['drange'].dt.hour
或df['drange'].dt.time
应该这样做。
# df['drange']=pd.to_datetime(df['drange'])
df.groupby(df['drange'].dt.hour).agg(...)
https://stackoverflow.com/questions/58307634
复制