我有一个包含登录日期和时间戳的用户表。
我正在尝试计算每个用户最近两次登录之间的差异。
例如 (df):
User | logints|| |34 |
---|---|
2024-07-10 07:49:11.773 | 34 |
2024-07-10 07:52:11.606 | 34 |
2024-07-11 08:49:11.947| ||34 | 2024-07-11 09:49:11.758 |
34 | 2024-07-12 09:46:11.758 |
37 | 2024-07-10 08:46:11.587 |
37 | 2024-07-10 08:49:11.356 |
37 | 2024-07-09 08:49:11.744 |
38 | 2024-07-10 08:55: 11.742 |
期望的结果: | 用户 |
logindelta
34 | 1天 |
---|---|
37 | 3分钟 |
38 | na |
这是我尝试过的: | 问题是 diff 并没有始终如一地在 groupby 内进行计算。 |
我也尝试过转入列进行计算,但未成功。 似乎应该有一个我可以在该组上运行的操作。
top_two_userlogins = df.groupby('User')['logints'].nlargest(2).diff()
The issue is the diff does not consistently be calculating within the groupby.
I've also tried pivoting into columns for the calculation unsuccessfully. It seems as though there should be an operation I can run on the group.
import pandas as pd
# 创建示例数据
df = pd.DataFrame({
'User': [34, 34, 34, 34, 37, 37, 37, 38],
'logints': [
'2024-07-10 07:49:11.773', '2024-07-10 07:52:11.606',
'2024-07-11 08:49:11.947', '2024-07-12 09:46:11.758',
'2024-07-10 08:46:11.587', '2024-07-10 08:49:11.356',
'2024-07-09 08:49:11.744', '2024-07-10 08:55:11.742'
]
})
df['logints'] = pd.to_datetime(df['logints'])
# 按用户分组并获取每个用户的最后两次登录
top_two_userlogins = df.groupby('User')['logints'].apply(lambda x: x.nlargest(2))
# 计算时间差
login_delta = top_two_userlogins.groupby(level=0).diff().dropna()
# 创建结果 DataFrame
result = pd.DataFrame({
'logindelta': login_delta
})
# 打印结果
print(result)
解释:
- 获取每个用户的最后两次登录:
-
我们使用
groupby('User')
按用户对 DataFrame 进行分组。 -
然后,我们使用
.apply(lambda x: x.nlargest(2))
获取每个用户组中logints
列的两个最大(最新)时间戳。 -
计算时间差:
-
我们再次使用
groupby(level=0)
按用户分组,这次是在top_two_userlogins
系列上进行分组。 -
然后,我们使用
.diff()
计算每个用户组中的连续时间戳之间的差异。 -
使用
.dropna()
删除生成的 NaN 值(这些值对应于每个用户组中的第一个时间戳,因为没有先前的值来计算差异)。 -
创建结果 DataFrame:
-
我们创建一个名为
result
的新 DataFrame,其中包含计算出的时间差作为logindelta
列。
输出:
logindelta
User
34 1 days 00:56:59.811
37 0 days 00:03:00.000
这表明用户 34 的最后两次登录之间相差 1 天 0 小时 56 分 59.811 秒,用户 37 的最后两次登录之间相差 3 分钟。
标签:python,pandas From: 78780728