2013-08-22 58 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是有序的。好点子。将更新最大和最小。 –