如何在Pandas中按日期和用户ID分组聚合通话数与时长?
解决方案
问题分析
你当前的代码无法正确聚合Hours字段,核心原因是直接将时间类型转为整数求和会得到错误的时间戳累加值,而非实际的时长总和。必须先将Hours转换为timedelta(时间差)类型,才能正确实现时长求和;Calls字段则可以直接用常规sum聚合。
分步实现代码
转换
Hours为timedelta类型
由于你的Hours是Datetime(Time)类型,先将其转为字符串再解析为timedelta:import pandas as pd # 假设你的DataFrame名为df df['Hours'] = pd.to_timedelta(df['Hours'].astype(str))分组聚合并重置索引
使用agg方法为不同字段指定对应的聚合函数,避免用apply导致的类型混乱:# 按Date和UserID分组,Calls求和,Hours求和 result_df = df.groupby(['Date', 'UserID'], as_index=False).agg( Calls=('Calls', 'sum'), Hours=('Hours', 'sum') )将聚合后的timedelta转为HH:MM:SS格式
聚合后的Hours是timedelta类型(如0 days 01:39:13),提取并格式化时间部分:# 转换为标准时间字符串格式 result_df['Hours'] = result_df['Hours'].astype(str).str.split().str[-1]
完整代码示例
import pandas as pd # 模拟你的原始数据 data = { 'Date': ['3-9-2022', '3-9-2022'], 'UserID': [2234, 2234], 'Calls': [10, 4], 'Hours': ['01:06:19', '00:32:54'] } df = pd.DataFrame(data) # 转换Date为datetime类型(匹配你的数据类型) df['Date'] = pd.to_datetime(df['Date']) # 转换Hours为timedelta df['Hours'] = pd.to_timedelta(df['Hours']) # 分组聚合 result_df = df.groupby(['Date', 'UserID'], as_index=False).agg( Calls=('Calls', 'sum'), Hours=('Hours', 'sum') ) # 格式化Hours为HH:MM:SS result_df['Hours'] = result_df['Hours'].astype(str).str.split().str[-1] print(result_df)
输出结果
Date UserID Calls Hours 0 2022-03-09 2234 14 01:39:13
内容的提问来源于stack exchange,提问作者rayyar
相关产品推荐
相关产品推荐

