使用psycopg2从SQL导入pandas DataFrame时直接指定数值类型
当然可以直接在导入时指定数据类型!
有两种常用方法能帮你跳过后续类型转换的步骤,直接得到符合预期数据类型的DataFrame:
方法1:使用pd.read_sql_query(推荐)
这是最简洁高效的方式,read_sql_query本身支持通过dtype参数直接指定各列的数据类型,无需手动处理游标返回的结果。示例代码如下:
import pandas as pd import sqlite3 # 这里以SQLite为例,其他数据库连接逻辑类似 # 建立数据库连接 conn = sqlite3.connect('your_database.db') # 编写查询语句 sql_query = "SELECT name, ts, open, close FROM your_target_table" # 直接指定每列的数据类型 df = pd.read_sql_query( sql_query, conn, dtype={ 'name': 'object', 'ts': 'datetime64[ns]', 'open': 'float64', 'close': 'float64' } ) df.info() # 此时各列已经是你指定的目标类型
这个方法的优势是pandas会自动处理数据库到DataFrame的类型映射,省去手动转换的繁琐。
方法2:手动转换后构造DataFrame
如果坚持要用cursor.fetchall()的方式,可以先把游标返回的元组数据逐个转换为目标类型,再构建DataFrame:
import pandas as pd import sqlite3 conn = sqlite3.connect('your_database.db') cursor = conn.cursor() cursor.execute("SELECT name, ts, open, close FROM your_target_table") data = cursor.fetchall() # 手动转换每列的类型后构造DataFrame df = pd.DataFrame({ 'name': [row[0] for row in data], # 保持字符串类型 'ts': pd.to_datetime([row[1] for row in data]), # 转换为日期时间类型 'open': pd.to_numeric([row[2] for row in data]), # 转换为数值类型 'close': pd.to_numeric([row[3] for row in data]) }) df.info()
为什么原方法会全是object类型?
因为cursor.fetchall()返回的是元组列表,pandas无法自动推断元组内元素的具体类型,所以默认将所有列设为object类型,这也是你需要后续用apply(pd.to_numeric)转换的原因。
内容的提问来源于stack exchange,提问作者Danny W
相关产品推荐
相关产品推荐

