按日期计算GroupU中的Pandas范围

2024-06-02 06:46:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含四列的大型数据帧,其中两列是“date”(格式为datetime)和“page”(保存为string)的位置)。我已经按'page'对dataframe进行了分组,并将其命名为pagegroup,并想知道访问每个页面的时间范围(例如,第一次访问是在1-1-13,最后一次访问是在1-5-13,所以最长时间是5天)。在

我知道在熊猫身上,我可以用date_range来比较两个日期,但可以尝试类似的方法:

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

退货

^{pr2}$

在尝试简单(非特定日期)numpy函数时,ptp给出了一个整数答案:

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

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

有人能想出一种方法来计算日期的范围并以可识别的日期格式返回吗?在

谢谢你


Tags: 数据方法dataframedatetimedatestring格式np
1条回答
网友
1楼 · 发布于 2024-06-02 06:46:07

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

^{pr2}$

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

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

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

相关问题 更多 >