python - 计算自定义时间范围内的发生次数

标签 python pandas dataframe

我目前正在处理 session 日志,并且有兴趣计算特定事件在自定义时间范围内(前 1 [5、10、10] 后)分钟内发生的次数。为简化起见: session 的开始定义为相关事件首次发生的时间。 我已经仅按相关事件过滤了 session ,数据框看起来与此类似。

输入

import pandas as pd
data_in = {'SessionId': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
        'Timestamp': ['2020-08-24 12:46:30.726000+00:00', '2020-08-24 12:46:38.726000+00:00', '2020-08-24 12:49:30.726000+00:00', '2020-08-24 12:50:49.726000+00:00', '2020-08-24 12:58:30.726000+00:00', '2021-02-12 16:12:12.726000+00:00', '2021-02-12 16:15:24.726000+00:00', '2021-02-12 16:31:07.726000+00:00', '2020-12-03 23:58:17.726000+00:00', '2020-12-04 00:03:44.726000+00:00'],
        'event': ['match', 'match', 'match', 'match', 'match', 'match', 'match', 'match', 'match', 'match']
}
df_in = pd.DataFrame(data_in)
df_in

期望的输出:

data_out = {'SessionId': ['A', 'B', 'C'],
        '#events_first_1_minute': [2, 1, 1],
        '#events_first_5_minute': [4, 2, 1],
        '#events_first_10_minute': [4, 2, 2],
        '#events_after_10_minute': [5, 3, 2]
}
df_out = pd.DataFrame(data_out)
df_out

我已经玩过 groupby 和 pd.Grouper。我得到了每个 session 的相关事件总数,但我没有看到自定义时间段的任何选项。另一个想法也是去掉日期部分,只关注时间,但当然也有从一天开始到另一天结束的 session (SessionId: C)。
感谢您的帮助!

最佳答案

使用 pandas.cut:

df_in['Timestamp'] = pd.to_datetime(df_in['Timestamp'])

bins = ['1min', '5min', '10min']
bins2 = pd.to_timedelta(['0']+bins+['10000days'])
group = pd.cut(df_in.groupby('SessionId')['Timestamp'].apply(lambda x: x-x.min()),
               bins=bins2, labels=bins+['>'+bins[-1]]).fillna(bins[0])


(df_in
 .groupby(['SessionId', group]).size()
 .unstack(level=1)
 .cumsum(axis=1)
)

输出:

Timestamp  1min  5min  10min  >10min
SessionId                           
A             2     4      4       5
B             1     2      2       3
C             1     1      2       2

关于python - 计算自定义时间范围内的发生次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71420063/

相关文章:

python - pandas groupby .sum 如何返回错误的值?

python - 将浮点值更改为整数值,然后在 Pandas 数据框中连接

python - 如何舍入/删除 pandas 列中的尾随 ".0"零?

python - 请求 HTTP header

python - 如何对混合类型的 Pandas 数据框进行重新采样?

python - 如何将 web URL.text 数据转换为 Dataframe

java - 什么是 "th"、 "python"、 "python3"、 "java"等...用于运行脚本的命令前面,称为?

python - dask Client.map() 调用期间会发生什么?

python - Pandas 使用其他列中的值创建新列,并根据列值进行选择

python - 如何使用索引来调用 pandas 数据框的标签