如何在pandas中计算每个用户的hh:mm:ss格式时间的中位数
Timedelta列求中位数报错解决方法
错误原因
该报错是因为你使用的pandas版本不支持直接对Timedelta类型的列执行中位数聚合,pandas默认只能对数值类型执行这类聚合计算。
解决方法
有两种可行方案:
方案一:类型转换计算(兼容所有pandas版本)
先将时间差转换为数值类型的总秒数,计算得到中位数后再转回Timedelta格式即可,修改后的完整代码如下:
file['date'] = pd.to_datetime(file['date']) # 计算操作间隔时间差 file['diff'] = file.groupby(['operation', 'user'])['date'].diff().fillna(pd.Timedelta(0)) # 过滤间隔不超过20秒的记录,使用Timedelta对象比较避免字符串兼容问题 file = file.loc[file['diff'] <= pd.Timedelta(seconds=20)] # 转换为总秒数的数值列 file['diff_seconds'] = file['diff'].dt.total_seconds() # 聚合求中位数后转回时间差格式 results = file.groupby(['operation', 'user'])['diff_seconds'].median().apply(pd.to_timedelta, unit='s') # 若需要输出hh:mm:ss格式的字符串,可添加下行代码 # results = results.apply(lambda x: str(x).split()[-1])
方案二:升级pandas版本
pandas 1.3.0及以上版本已经原生支持Timedelta类型的中位数聚合,你可以升级pandas后直接运行原有代码:
pip install --upgrade pandas
内容的提问来源于stack exchange,提问作者Rinat Devyatyarov
相关产品推荐
相关产品推荐

