2013-11-21 214 views
5

我有一個包含date列的熊貓數據框。該列的元素類型爲pandas.tslib.Timestamp按日期分組熊貓數據框

我想按日期對數據幀進行分組,但不包括日期更精確的時間戳信息(即按日期分組,所有Feb 23, 2011都分組)。我知道如何在SQL中表達這一點,但對於Pandas來說,這是相當新的。

This question做的事情非常相似,但我不明白代碼,它使用datetime對象。

documentation,我甚至不知道如何從Pandas Timestamp對象中檢索日期。我可以轉換爲datetime的對象,但看起來很迂迴。


按照要求,中df.head()輸出:

date show network timed session_id 
0 2011-12-03 02:48:52 Monk TV38 670  00003DA9-01D2-E7A9-4177-203BE6A9E2BA  
1 2011-12-03 03:00:09 WBZ News TV38 205  00003DA9-01D2-E7A9-4177-203BE6A9E2BA 
2 2011-12-03 03:04:04 Dateline NBC NBC  30 00003DA9-01D2-E7A9-4177-203BE6A9E2BA 
3 2011-12-03 03:04:35 20/20 ABC  25 00003DA9-01D2-E7A9-4177-203BE6A9E2BA 
4 2011-12-03 03:04:56 College Football FOX  55 00003DA9-01D2-E7A9-4177-203BE6A9E2BA 
+1

你的df.head()的輸出將會在這裏受歡迎 – Boud

回答

12

可以使用normalize DatetimeIndex方法(它需要到午夜的那一天):

In [11]: df['date'] 
Out[11]: 
0 2011-12-03 02:48:52 
1 2011-12-03 03:00:09 
2 2011-12-03 03:04:04 
3 2011-12-03 03:04:35 
4 2011-12-03 03:04:56 
Name: date, dtype: datetime64[ns] 

In [12]: pd.DatetimeIndex(df['date']).normalize() 
Out[12]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2011-12-03 00:00:00, ..., 2011-12-03 00:00:00] 
Length: 5, Freq: None, Timezone: None 

你可以GROUPBY此:

g = df.groupby(pd.DatetimeIndex(df['date']).normalize()) 

在0.15,你將有訪問dt屬性,所以可以這樣寫:

g = df.groupby(df['date'].dt.normalize()) 
+0

謝謝,我明白了,這正是我所尋找的。 –

+2

另一種選擇是:'pd.DatetimeIndex(df [「date」])。date'。一個好處是,許多你想分組的東西都是內置的:'.month','.year','.hour'等。 – DSM

+0

看來這種方法忽略時區,但patrickrm101不會。 –

3

如果你想GROUPBY和骨料(如在SQL)或創建一個日期,而不是一個時間戳指數目前尚不清楚。

如果你想GROUPBY和彙集起來,你可以這樣來做:

df.groupby(df.set_index('date').index.date).mean() 

時間序列指標有日期時間性質在如天,日期等。這將彙集計時的列,因爲它是唯一數字列。

如果你想創建一個日期水平的指數,你可以這樣做:

import datetime 
df.set_index(['date', df.date.apply(lambda x: datetime.datetime.date(x))], inplace=True) 
df.index.names = ['timestamp', 'daydate'] 

這會給你與時間戳和日期的多指標。如果您不希望索引永久化,請刪除inplace =參數。

+0

我的意思是groupby和aggregate。看起來你的方法比安迪海登的方法更通用一些(比如僅僅工作幾天)。 –