繁体   English   中英

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设置为按日期和时间分组,然后:

  • 重置索引
  • 将新列转换为浮动
  • 带有 pd.cut 的 bin
  • 时光倒流
  • 最后 group-by 然后聚合

...但我想知道是否有更清洁的方法可以达到相同的结果。

Series.dt.time / DatetimeIndex.time将时间返回为datetime.time 这不是很好,因为 pandas 最适用于timedelta64 ,因此您'time'列被转换为object ,失去所有日期时间功能。

您可以减去标准化日期以获得时间作为时间增量,以便您可以继续使用timedeltadatetime时间工具。 您可以将此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.hourdf['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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM