从MongoDB获取float数值求和报错:unsupported operand type(s) for +: 'int' and 'str'
问题分析与解决方案
看起来你遇到了两个核心问题导致这个报错,咱们一步步拆解解决:
1. 错误使用sum()函数
你现在在循环里每次取出单个document['Price'],然后直接调用sum(Price)——但sum()是用来对**可迭代对象(比如列表、元组)**求和的,单个数值不是可迭代对象,而且你的逻辑应该是想把所有符合时间条件的Price加起来,而不是每次循环sum单个值。
2. Price字段存在字符串类型
报错里提到int和str无法相加,说明你从MongoDB取到的Price不全是float/int类型,有些可能被存成了字符串(比如MongoDB里字段类型不统一,或者读取时自动转成了字符串)。
修正后的代码
# 初始化空列表,收集符合条件的有效Price valid_prices = [] for document in cursor: # 先处理Price的类型转换,确保是数值类型 try: price = float(document['Price']) except ValueError: # 遇到无法转换的无效值,跳过并提示 print(f"跳过无效Price值:{document['Price']}") continue # 处理时间逻辑,加异常捕获避免格式错误中断循环 try: item = datetime.strptime(cortime(document['TimeStamp']), "%Y:%m:%d %H:%M:%S") except Exception as time_error: print(f"时间格式处理失败:{time_error}") continue # 用数值方式比较时间差,比字符串更可靠(5分钟=300秒) time_diff = li - item if time_diff.total_seconds() <= 300: valid_prices.append(price) # 最后统一求和并输出结果 if valid_prices: total_sum = sum(valid_prices) print(f"符合时间条件的Price总和:{total_sum}") else: print("没有找到符合时间条件的Price数据")
关键修改点说明
- 收集后再求和:用
valid_prices列表存储所有符合条件的Price,循环结束后统一调用sum(),这才是正确的批量求和逻辑。 - 强制类型转换:通过
float(document['Price'])确保每个Price都是数值类型,同时加异常处理跳过无效值,避免字符串导致的加法错误。 - 时间差比较优化:不再把时间差转成字符串比较(字符串比较存在逻辑漏洞),而是用
total_seconds()转成秒数和300秒(5分钟)对比,结果更准确。
内容的提问来源于stack exchange,提问作者ChunkBMB
相关产品推荐
相关产品推荐

