使用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
相关产品推荐
相关产品推荐

