Python 在pandas中计算GroupBy对象上的日期范围

Python 在pandas中计算GroupBy对象上的日期范围,python,pandas,Python,Pandas,我有一个包含四列的海量数据框,其中两列是“日期”(采用datetime格式)和“页面”(保存为字符串的位置)。我已经按“页面”对数据帧进行了分组,并将其称为pagegroup,我想知道访问每个页面的时间范围(例如,第一次访问是在1-1-13,最后一次访问是在1-5-13,因此最短时间为5天) 我知道在pandas中,我可以使用date\u range来比较两个日期时间,但可以尝试以下方法: pagegroup['date'].agg(np.date_range) 返回 AttributeErr

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

我知道在pandas中,我可以使用
date\u 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
有人能想出一种方法来计算日期范围并以可识别的日期格式返回吗


谢谢

假设您已按日期编制索引,则可以使用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正常的情况下才有效,否则可以使用max/min(它实际上读起来更好,但效率可能更低):

注意:为了得到两个时间戳之间的时间差,我们刚刚减去(
-

如果日期是一列而不是索引,则使用列名:

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

是一个pandas函数(因此它是
pd.date\u range
而不是
np
),但它不会比较两个日期时间。可能您需要对组进行排序,我想他希望每个组中的最早和最晚日期。@elyase tbh无法100%确定所需的结果。哦,我想我明白你的意思了,上面假设DatetimeIndex是有序的。说得好。将使用最大值和最小值进行更新。
g.apply(lambda x: x['date'].iloc[-1] - x['date'].iloc[0])
g.apply(lambda x: x['date'].max() - x['date'].min())