按小时分组pandas数据框的问题

3

首先,我的数据集如下所示

here

我想按照pickup_datetime小时分组我的列。我在这里找到了相关问题,但某种原因解决方案似乎不起作用。我在下面包含了我的尝试。

我最开始使用了以下代码:

df["dropoff_datetime"] = pd.to_datetime(df["dropoff_datetime"])
df["pickup_datetime"] = pd.to_datetime(df["pickup_datetime"])

test = df.groupby(df.hour).sum()

我遇到了以下错误:

AttributeError: 'DataFrame' object has no attribute 'hour'

然后我试了这个:

test = df.groupby(df.dropoff_datetime.hour).sum()

我遇到了以下错误:

AttributeError: 'Series' object has no attribute 'hour'

我有点困惑,因为我的情况似乎与上面链接的问题相同。但是我不确定为什么会出现错误。如果能得到帮助,将不胜感激。

2个回答

6
我们可以使用 Series.dt.hour 访问器:
test = df.groupby(df['pickup_datetime'].dt.hour).sum()

这里是一个描述差异的示例:

In [136]: times = pd.to_datetime(['2017-08-01 13:13:13', '2017-08-01 20:20:20'])

In [137]: times
Out[137]: DatetimeIndex(['2017-08-01 13:13:13', '2017-08-01 20:20:20'], dtype='datetime64[ns]', freq=None)

In [138]: type(times)
Out[138]: pandas.core.indexes.datetimes.DatetimeIndex

In [139]: times.hour
Out[139]: Int64Index([13, 20], dtype='int64')

如上所示,DatetimeIndex 具有 "直接" 的 .hour 访问器,但是 datetime dtype 的 Series 具有 .dt.hour 访问器:
In [140]: df = pd.DataFrame({'Date': times})

In [141]: df
Out[141]:
                 Date
0 2017-08-01 13:13:13
1 2017-08-01 20:20:20

In [142]: type(df.Date)
Out[142]: pandas.core.series.Series

In [143]: df['Date'].dt.hour
Out[143]:
0    13
1    20
Name: Date, dtype: int64

如果我们将Date列设置为索引:
In [146]: df.index = df['Date']

In [147]: df
Out[147]:
                                   Date
Date
2017-08-01 13:13:13 2017-08-01 13:13:13
2017-08-01 20:20:20 2017-08-01 20:20:20

它变成:

In [149]: type(df.index)
Out[149]: pandas.core.indexes.datetimes.DatetimeIndex

这样我们就可以直接访问它(不需要使用.dt访问器):

In [148]: df.index.hour
Out[148]: Int64Index([13, 20], dtype='int64', name='Date')

1

需要使用 .dt,因为要处理 Series - Series.dt.hour:

test = df.groupby(df.dropoff_datetime.dt.hour).sum()

如果使用 DatetimeIndex,则省略它 - DatetimeIndex.hour
test = df.groupby(df.index.hour).sum()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接