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

查询得到的latitude字段为何从str变为decimal.Decimal并触发运算报错

问题原因解析
  • 类型检测逻辑错误
    你编写的for item in rows.columns遍历对象是DataFrame的列名,列名本身就是字符串类型,因此打印返回的是列名的类型,和列内存储的数据类型完全无关。如果要查看列的实际存储类型,可以执行print(rows.dtypes),或者取具体行的字段值再检测类型。
  • Decimal类型来源
    你查询的数据库表中latitude字段为DECIMAL类型,数据库驱动查询该类型字段时会默认映射为Python内置的decimal.Decimal类型,pandas构造DataFrame时默认保留该原生类型,不会主动转换为float,所以后续取出字段值传入函数时类型为decimal.Decimal,不存在隐式类型转换,你观察到的类型差异完全是之前的检测逻辑错误导致的误判。
  • 运算报错原因
    Python的decimal.Decimal类型不支持直接和float类型做算术运算,因此触发了对应的类型不匹配报错。
解决方案

由于你无权修改day_length函数内部逻辑,只需要在传入参数前将latitude转换为float类型即可,可选方案如下:

  1. 构造DataFrame时统一转换latitude列的全局类型,后续所有调用无需额外处理:
cur.execute("SELECT site_number, site_name, latitude FROM mydb.station ORDER BY site_number")
rows = pd.DataFrame(cur.fetchall(), columns=['site_number', 'site_name', 'latitude'])
# 将latitude列转换为float类型
rows['latitude'] = rows['latitude'].astype(float)
  1. 调用函数时临时转换参数:
length_hours = day_length(day, float(v.latitude))
  1. 直接在SQL查询时做类型转换,从数据源侧直接返回浮点类型数据:
SELECT site_number, site_name, CAST(latitude AS FLOAT) AS latitude FROM mydb.station ORDER BY site_number

内容的提问来源于stack exchange,提问作者Sean S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 19:45:07