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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:26:09