2013-08-22 55 views
-2

我有一個包含四列的海量數據框,其中兩列是'日期'(格式爲datetime)和'頁面'(位置另存爲string)。我已將數據框分組爲'page',並將其稱爲pagegroup,並且想知道每個頁面被訪問的時間範圍(例如,第一次訪問在1-1-13上,最後一次在1-5-13上,所以max-min是5天)。在pandas中的GroupBy對象上計算date_range

我知道熊貓,我可以使用date_range比較兩個日期時間,但在嘗試喜歡的事:

pagegroup['date'].agg(np.date_range) 

回報

AttributeError: 'module' object has no attribute 'date_range' 

,而試圖簡單(非特定日期的)numpy的功能ptp給我一個整數的答案:

daterange = pagegroup['date'].agg([np.ptp]) 
daterange.head() 

          ptp 
page       
%2F       0 
/   13325984000000000 
/-509606456 297697000000000 
/-511484155     0 
/-511616154     0 

有誰能想到一種計算日期範圍的方法,並使其以可識別的日期格式返回?

謝謝

+1

['date_range'](http://pandas.pydata.org/pandas-docs/stable/timeseries。 html#time-series-date-functionality)是一個熊貓函數(所以它是'pd.date_range'而不是'np'),但它不會比較兩個日期時間。 –

回答

1

假設你已經通過日期時間索引可以使用GROUPBY適用於:

In [11]: df = pd.DataFrame([[1, 2], [1, 3], [2, 4]], 
          columns=list('ab'), 
          index=pd.date_range('2013', freq='H', periods=3) 



In [12]: df 
Out[12]: 
        a b 
2013-08-22 00:00:00 1 2 
2013-08-22 01:00:00 1 3 
2013-08-22 02:00:00 2 4 

In [13]: g = df.groupby('a') 

In [14]: g.apply(lambda x: x.iloc[-1].name - x.iloc[0].name) 
Out[14]: 
a 
1 01:00:00 
2 00:00:00 
dtype: timedelta64[ns] 

這裏iloc[-1]抓住了最後一排的組中,並得到iloc[0]第一。 name屬性是行的索引。

@Elyase指出,這隻能如果原始DatetimeIndex是爲了,如果沒有可以使用的最大/最小(這實際上讀取更好,但可能不太有效):

In [15]: g.apply(lambda x: x.index.max() - x.index.min()) 
Out[15]: 
a 
1 01:00:00 
2 00:00:00 
dtype: timedelta64[ns] 

注:在兩個時間戳之間獲得timedelta(我們剛剛減去)(-)。

如果日期是列而不是索引,然後使用柱名:

g.apply(lambda x: x['date'].iloc[-1] - x['date'].iloc[0]) 
g.apply(lambda x: x['date'].max() - x['date'].min()) 
+0

可能你需要對這些組進行排序,我認爲他希望每組中的最早和最晚的日期。 – elyase

+0

@elyase tbh不是100%確定結果是什麼。哦,我想我明白你的意思,上面假設DatetimeIndex是有序的。好點子。將更新最大和最小。 –