[英]How do the sum of a column with group by date from datetime ? Python Pandas
[英]Pandas: How to group by a datetime column, using only the time and discarding the date
我有一个带有日期时间列的 dataframe。 我只想按时间分量分组并聚合,例如取平均值。
我知道我可以使用 pd.Grouper 按日期和时间分组,但它不能只准时工作。
假设我们有以下 dataframe:
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
设置为按日期和时间分组,然后:
...但我想知道是否有更清洁的方法可以达到相同的结果。
Series.dt.time
/ DatetimeIndex.time
将时间返回为datetime.time
。 这不是很好,因为 pandas 最适用于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
,这将得到相同的 output 直到索引名称
df['time'] = (df.drange - df.drange.dt.normalize()) # timedelta64[ns]
df.groupby(pd.Grouper(key='time', freq='5T')).mean()
当您使用DataFrame.groupby
时,您可以使用Series 参数。 此外,如果您的系列是日期时间,您可以使用series.dt
访问日期的属性。 在您的情况下df['drange'].dt.hour
或df['drange'].dt.time
应该这样做。
# df['drange']=pd.to_datetime(df['drange'])
df.groupby(df['drange'].dt.hour).agg(...)
我假设 5T 您尝试按时间分组,然后按 5 分钟间隔分组?
尝试这个:
import pandas as pd
import numpy as np
drange = pd.date_range('2019-08-01 00:00', '2019-08-12 12:00', freq='5T')
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))
df.set_index(df['time'])
df.groupby(df['time']).agg('mean')
c0 c1
time
00:00:00 0.503952 0.437320
00:05:00 0.437571 0.404878
00:10:00 0.524496 0.573247
00:15:00 0.517793 0.534535
00:20:00 0.434469 0.392725
... ... ...
23:35:00 0.533461 0.561525
23:40:00 0.633349 0.422529
23:45:00 0.427919 0.486180
23:50:00 0.497414 0.489659
23:55:00 0.561915 0.500814
[288 rows x 2 columns]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.