python - 使用 pandas 从日志文件分析生成 session

标签 python pandas timedelta dataframe

我正在分析一个 Apache 日志文件,并将其导入到一个 pandas 数据框中。

'65.55.52.118 - - [30/May/2013:06:58:52 -0600] "GET /detailedAddVen.php?refId=7954&uId=2802 HTTP/1.1" 200 4514 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"'

我的数据框:

enter image description here

我想根据 IP、代理和时差将其分组到 session 中(如果持续时间大于 30 分钟,则应该是一个新 session )。

通过IP和Agent对数据帧进行分组很容易,但是如何检查这个时间差?希望问题清楚。

sessions = df.groupby(['IP', 'Agent']).size()

更新:df.index 如下:

<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-30 06:00:41, ..., 2013-05-30 22:29:14]
Length: 31975, Freq: None, Timezone: None

最佳答案

我会使用 shift 来做到这一点和一个 cumsum (这是一个简单的例子,用数字代替时间——但它们的工作原理完全一样):

In [11]: s = pd.Series([1., 1.1, 1.2, 2.7, 3.2, 3.8, 3.9])

In [12]: (s - s.shift(1) > 0.5).fillna(0).cumsum(skipna=False)  # *
Out[12]:
0    0
1    0
2    0
3    1
4    1
5    2
6    2
dtype: int64

* 对 skipna=False 的需求似乎是一个错误。

然后你可以在 groupby apply 中使用它:

In [21]: df = pd.DataFrame([[1.1, 1.7, 2.5, 2.6, 2.7, 3.4], list('AAABBB')]).T

In [22]: df.columns = ['time', 'ip']

In [23]: df
Out[23]:
  time ip
0  1.1  A
1  1.7  A
2  2.5  A
3  2.6  B
4  2.7  B
5  3.4  B

In [24]: g = df.groupby('ip')

In [25]: df['session_number'] = g['time'].apply(lambda s: (s - s.shift(1) > 0.5).fillna(0).cumsum(skipna=False))

In [26]: df
Out[26]:
  time ip  session_number
0  1.1  A               0
1  1.7  A               1
2  2.5  A               2
3  2.6  B               0
4  2.7  B               0
5  3.4  B               1

现在您可以按 'ip''session_number' 分组(并分析每个 session )。

关于python - 使用 pandas 从日志文件分析生成 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17547391/

相关文章:

python - 如何为交互式 python 设置默认 PS1 值?

python - 将天数 Int64 转换为日期

python - 将特定时间量添加到日期时间列

python - Pandas 数据框字符列到整数

python - 如何在 Pandas 数据框中获取格式正确的索引

python-3.x - 类型错误 : conversion from Series to Decimal is not supported

python - 将连续时间差 (timedelta) 转换为秒

python - Numpy 向量化和原子向量

python - 中世纪字符的 UnicodeDecodeError

python - Django - 用户在 View 中上传 S3 文件