2017-08-08 54 views
2

首先,我的數據集如下所示問題與分組數據框大熊貓

here

我想要做的pickup_datetime小時是組我的專欄。我在here上發現了相關問題,但出於某種原因,解決方案似乎無法正常工作。我在下面列入了我的嘗試。

我第一次開始了與此:

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' 

我有點困惑,因爲它好像我的情況與上面鏈接的問題一樣。我不知道爲什麼我會收到錯誤。任何幫助,將不勝感激

回答

3

我們可以使用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 D型的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') 
+0

這是完美的,謝謝! – madsthaks

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()