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())