数组内时间类型数据转整数/浮点数时遇类型运算错误及Python代码调试求助
解决计算平均时长时出现的
unsupported operand type(s) for +: 'int' and 'numpy.str_'错误 这个错误核心是你在操作时混合了整数和numpy字符串类型,不过从你的代码逻辑来看,更根本的问题是直接对datetime对象做平均运算的方式容易引发类型冲突。我们可以换个思路:先把时间转成可计算的数值(比如总秒数),算出平均值后再转回时间格式,这样就能彻底解决类型问题。
具体修改步骤和代码说明
- 统一时间字符串类型:先把数据库返回的
duracaoforno(可能是numpy字符串类型)转成Python原生字符串,避免后续解析时的类型异常。 - 时间转总秒数:将
%H:%M:%S格式的时间解析为datetime对象后,计算它对应的总秒数(整数/浮点数),这样就可以直接做算术运算了。 - 计算平均并转回时间格式:对总秒数求平均值,再把结果转回
timedelta对象,最后格式化为你需要的时间字符串。
修改后的完整代码:
from datetime import datetime, timedelta def ProdGrafico(request): ## 炉平均时长数据 mediaForno = Relatorioresumido.objects.all() total_items = len(mediaForno) list_total_seconds = [] for item in mediaForno: # 处理numpy.str_类型,转为原生字符串 time_str = str(item.duracaoforno) # 解析时间字符串为datetime对象 time_obj = datetime.strptime(time_str, '%H:%M:%S') # 计算该时间对应的总秒数 total_sec = timedelta( hours=time_obj.hour, minutes=time_obj.minute, seconds=time_obj.second ).total_seconds() list_total_seconds.append(total_sec) try: # 计算平均秒数 avg_seconds = sum(list_total_seconds) / total_items # 将平均秒数转换为时间间隔对象 avg_duration = timedelta(seconds=avg_seconds) # 格式化为HH:MM:SS格式(如果超过24小时也能正确显示) mediaForno = str(avg_duration) print(mediaForno) except ZeroDivisionError: # 没有数据时返回默认的空时长 mediaForno = "00:00:00" # 这里记得补充返回request对应的响应内容,比如: # return render(request, 'your_template.html', {'mediaForno': mediaForno})
关键修改点解释
- 解决numpy.str_类型问题:通过
str(item.duracaoforno)强制转换为Python原生字符串,避免了后续运算中不同字符串类型的冲突。 - 数值化计算更可靠:用总秒数作为中间值,完全避开了
datetime对象直接运算可能带来的类型问题,计算逻辑更清晰。 - 规范默认值:把原来的
00改成"00:00:00",符合时间格式的预期,也避免了Python整数的语法问题(不能以双0开头)。
内容的提问来源于stack exchange,提问作者user273970
相关产品推荐
相关产品推荐

