-2

我有一个包含四列的大量数据框,其中两列是“日期”(datetime格式)和“页面”(保存为的位置string)。我已按“页面”对数据框进行分组并调用它pagegroup,并且想知道访问每个页面的时间范围(例如,第一次访问是在 1-1-13,最后一次访问是在 1-5-13,所以最大-最小为 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

谁能想到一种方法来计算日期范围并让它以可识别的日期格式返回?

谢谢

4

1 回答 1

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 有序时才有效,否则您可以使用 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())
于 2013-08-22T19:39:12.350 回答