解决Pandas中行间分钟时间差转小时的格式异常问题
解决时间差分钟转小时格式异常的问题
看起来你遇到的问题根源是数据类型强制转换导致的:你之前的t列被设置为int64(整数类型),当你将浮点结果(比如30/60=0.5)赋值给这个列时,pandas会自动把浮点数强制转为整数,0.5就被向上取整成1了,这就是结果不符合预期的原因。
下面给你几个可行的解决方案:
方案1:创建新列存储小时格式结果(推荐)
避免覆盖原有整数类型的t列,直接新增一列来存储浮点型的小时数:
# 保留原有的分钟级时间差计算(如果需要的话) df1['t'] = df1['delta'].apply(lambda x: x / np.timedelta64(1,'m')).astype('int64') % (24*60) # 新增列计算小时格式的时间差 df1['hours_diff'] = df1['t'] / 60
方案2:修改原有列的数据类型后再赋值
如果你一定要覆盖原来的t列,可以先把它的类型改成浮点型,再进行计算:
# 将t列转换为浮点类型 df1['t'] = df1['t'].astype('float64') # 重新计算小时格式的时间差 df1['t'] = df1['delta'].apply(lambda x: x / np.timedelta64(1,'m')).astype('int64') % (24*60) / 60
方案3:用pandas原生方法简化计算(更高效)
其实不需要用apply,pandas的timedelta类型自带更便捷的转换方法,代码更简洁也更高效:
# 计算行与行的时间差,第一行填充0 df1['delta'] = df1['time_diff'].diff().fillna(pd.Timedelta(seconds=0)) # 直接将时间差转换为小时数(总秒数除以3600) df1['hours_diff'] = df1['delta'].dt.total_seconds() / 3600
用以上任意一种方法,你都能得到符合预期的结果:比如30分钟对应0.5,75分钟对应1.25,完全匹配你给出的预期输出。
内容的提问来源于stack exchange,提问作者team
相关产品推荐
相关产品推荐

