You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas计算各用户物品浏览时间差(生成时长数据)

如何用Pandas计算用户单物品的浏览耗时(间隔分钟数)

我来帮你一步步解决这个问题,直接上实操步骤和详细解释:

1. 准备数据与环境

首先导入Pandas库,加载你的数据并将时间列转换为Pandas可识别的datetime类型——这是计算时间差的基础:

import pandas as pd

# 加载你的原始数据(这里用你提供的示例数据构造DataFrame)
raw_data = [
    [121, 160, '2015-10-20 17:02:02'],
    [231, 160, '2015-10-18 11:02:29'],
    [231, 161, '2015-10-18 11:05:23'],
    [121, 166, '2015-10-18 11:04:34'],
    [231, 180, '2015-10-18 11:06:16'],
    [121, 182, '2015-10-20 17:02:10'],
    [134, 182, '2015-10-18 11:02:53'],
    [124, 185, '2015-10-18 11:04:23'],
    [231, 187, '2015-10-18 11:04:45'],
    [124, 190, '2015-10-18 11:05:43']
]

df = pd.DataFrame(raw_data, columns=['user_id', 'item_id', 'view_started'])
# 将字符串格式的时间转换为datetime类型
df['view_started'] = pd.to_datetime(df['view_started'])

2. 按用户排序并计算时间差

核心思路是:每个用户的浏览记录必须按时间顺序排列,然后用下一条浏览的开始时间减去当前物品的开始时间,得到当前物品的浏览耗时:

# 先按用户ID分组,再按浏览时间排序,确保时间顺序正确
df_sorted = df.sort_values(by=['user_id', 'view_started'])

# 对每个用户组,把下一条浏览的时间移到当前行(shift(-1)表示向下偏移一行)
df_sorted['next_view_time'] = df_sorted.groupby('user_id')['view_started'].shift(-1)

# 计算时间差并转换为分钟数(Timedelta转秒再除以60)
df_sorted['minutes'] = (df_sorted['next_view_time'] - df_sorted['view_started']).dt.total_seconds() / 60

3. 整理目标输出表

最后筛选出需要的列,并且可以根据需求处理缺失值(用户最后一条浏览记录没有下一条,所以时间差为NaN,可选择保留或删除):

# 提取目标列,删除无下一条浏览记录的行(也可以保留NaN,根据业务需求调整)
result_df = df_sorted[['user_id', 'item_id', 'minutes']].dropna()

# 可选:将分钟数取整,让结果更整洁
result_df['minutes'] = result_df['minutes'].round(0).astype(int)

# 查看最终结果
print(result_df)

关键逻辑解释

  • sort_values(['user_id', 'view_started']):必须保证每个用户的浏览记录是按时间先后排序的,否则计算的时间差会完全错误
  • groupby('user_id')['view_started'].shift(-1):只在同一个用户的范围内偏移时间,避免跨用户计算错误的时间差
  • dt.total_seconds() / 60:把Pandas的Timedelta类型时间差转换为分钟数,完全符合你需要的输出格式

内容的提问来源于stack exchange,提问作者add-semi-colons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:53:07