查询得到的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类型即可,可选方案如下:
- 构造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)
- 调用函数时临时转换参数:
length_hours = day_length(day, float(v.latitude))
- 直接在SQL查询时做类型转换,从数据源侧直接返回浮点类型数据:
SELECT site_number, site_name, CAST(latitude AS FLOAT) AS latitude FROM mydb.station ORDER BY site_number
内容的提问来源于stack exchange,提问作者Sean S
相关产品推荐
相关产品推荐

