计算pandas中GroupBy对象的date_range

时间:2013-08-22 19:26:01

标签: python pandas

我有一个包含四列的海量数据框,其中两列是“日期”(datetime格式)和“页面”(保存为string的位置)。我按“页面”对数据框进行了分组并将其称为pagegroup,并想知道每个页面的访问时间范围(例如,第一次访问是在1-1-13,最后一次是在1- 5-13,所以max-min是5天)。

我知道在熊猫中我可以使用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 个答案:

答案 0 :(得分:1)

假设您已按日期时间编制索引,可以使用groupby apply:

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有序的情况下才有效,如果没有,你可以使用max / min(实际上读取效果更好,但效率可能更低):

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]

注意:要获取两个时间戳之间的时间值,我们刚刚减去(-)。

如果date是列而不是索引,则使用列名:

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