You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组内时间类型数据转整数/浮点数时遇类型运算错误及Python代码调试求助

解决计算平均时长时出现的unsupported operand type(s) for +: 'int' and 'numpy.str_'错误

这个错误核心是你在操作时混合了整数和numpy字符串类型,不过从你的代码逻辑来看,更根本的问题是直接对datetime对象做平均运算的方式容易引发类型冲突。我们可以换个思路:先把时间转成可计算的数值(比如总秒数),算出平均值后再转回时间格式,这样就能彻底解决类型问题。

具体修改步骤和代码说明

  1. 统一时间字符串类型:先把数据库返回的duracaoforno(可能是numpy字符串类型)转成Python原生字符串,避免后续解析时的类型异常。
  2. 时间转总秒数:将%H:%M:%S格式的时间解析为datetime对象后,计算它对应的总秒数(整数/浮点数),这样就可以直接做算术运算了。
  3. 计算平均并转回时间格式:对总秒数求平均值,再把结果转回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 16:22:32