如何将SQLite读取的字符串数字列表转为数值列表适配np.polyfit计算
调整方法:将sqlite读取的字符串数字转换为纯数值类型适配np.polyfit
问题成因
当前返回列表全是字符串格式数字的原因有两个:
- 建表时将年份、CH4观测值字段设为TEXT类型存储,查询返回时自然输出字符串格式
- 逐行提取字段时未做类型转换,直接将原始查询结果存入列表,没有做格式适配
具体修改逻辑
通用方案:追加列表时直接做类型转换
这个方法适配所有存储类型,不管数据库字段是TEXT还是正规数字类型,都能生效。只需要在逐行将字段值加入years、ch4列表时,同步转成对应数值类型即可。
你可以对照自己原有代码修改,核心修改段如下:
def getCH4(): years = [] ch4 = [] conn = sqlite3.connect('table1.db') cur = conn.cursor() cur.execute("SELECT * FROM datahub") for row in cur.fetchall(): # 替换为你原有代码里取对应字段的索引位置 # 年份是整数转int,CH4是带小数的观测值转float years.append(int(row[你原代码中存年份的列索引])) ch4.append(float(row[你原代码中存CH4值的列索引])) cur.close() conn.close() return years, ch4
小提示:如果数据库存在空值、非数字的脏数据,可以在转换时加简单判断跳过非法行,避免触发类型转换报错。
简化方案:开启sqlite内置类型自动解析
如果你的表本身是按照正规数字类型(INTEGER存年份、REAL存CH4值)建表,只是sqlite3默认不自动解析返回值类型,可以在连接数据库时开启类型检测开关,让查询过程自动完成类型转换,无需逐行手动处理:
conn = sqlite3.connect( 'table1.db', detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES )
注意:如果数据库字段是TEXT类型存储的数字,这个自动解析逻辑不会生效,仍需要使用通用方案手动转换类型。
效果验证
修改完成后,可通过简单打印确认返回值格式符合要求:
x, y = getCH4() print(x[:2]) # 正常应输出 [1999, 2000],而非 ['1999', '2000'] print(type(x[0])) # 正常应输出 <class 'int'>
此时直接传入np.polyfit做线性拟合即可正常运行,不会触发类型不匹配的报错。
内容的提问来源于stack exchange,提问作者Tajinder Sharma
相关产品推荐
相关产品推荐

