首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >psycopg2:无法调整类型“”numpy.int64“”

psycopg2:无法调整类型“”numpy.int64“”
EN

Stack Overflow用户
提问于 2018-05-31 21:57:22
回答 4查看 21.2K关注 0票数 16

我有一个具有如下所示数据类型的数据帧,我想将该数据帧插入到postgres DB中,但由于出现错误can't adapt type 'numpy.int64'而失败

代码语言:javascript
运行
复制
id_code               int64
sector              object
created_date         float64
updated_date    float64

如何将这些类型转换为原生python类型,例如从int64 (本质上是'numpy.int64')转换为典型的int类型,然后通过psycopg2客户端为postgres接受。

代码语言:javascript
运行
复制
data['id_code'].astype(np.int)  defaults to int64

尽管如此,仍然可以从一种numpy类型转换为另一种类型(例如,从int转换为float)。

代码语言:javascript
运行
复制
data['id_code'].astype(float)

更改为

代码语言:javascript
运行
复制
dtype: float64

底线是psycopg2似乎不理解numpy数据类型,如果有人知道如何将它们转换为经典类型的话。

更新:插入到数据库

代码语言:javascript
运行
复制
def insert_many():
    """Add data to the table."""
    sql_query = """INSERT INTO classification(
                id_code, sector, created_date, updated_date)
                VALUES (%s, %s, %s, %s);"""
    data = pd.read_excel(fh, sheet_name=sheetname)
    data_list = list(data.to_records())

    conn = None
    try:
        conn = psycopg2.connect(db)
        cur = conn.cursor()
        cur.executemany(sql_query, data_list)
        conn.commit()
        cur.close()
    except(Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-06-01 02:15:06

我不确定为什么您的data_list包含NumPy数据类型,但是当我运行您的代码时,同样的事情也会发生在我身上。这是另一种构造data_list的方法,这样整型和浮点型就会变成它们的原生python类型:

代码语言:javascript
运行
复制
data_list = [list(row) for row in data.itertuples(index=False)] 

替代方法

我认为使用pandas to_sql可以用更少的代码行完成同样的事情。

代码语言:javascript
运行
复制
import sqlalchemy
import pandas as pd
data = pd.read_excel(fh, sheet_name=sheetname)
engine = sqlalchemy.create_engine("postgresql://username@hostname/dbname")
data.to_sql(engine, 'classification', if_exists='append', index=False)
票数 7
EN

Stack Overflow用户

发布于 2019-05-31 15:27:53

在您的代码中添加以下内容:

代码语言:javascript
运行
复制
import numpy
from psycopg2.extensions import register_adapter, AsIs
def addapt_numpy_float64(numpy_float64):
    return AsIs(numpy_float64)
def addapt_numpy_int64(numpy_int64):
    return AsIs(numpy_int64)
register_adapter(numpy.float64, addapt_numpy_float64)
register_adapter(numpy.int64, addapt_numpy_int64)
票数 16
EN

Stack Overflow用户

发布于 2019-06-26 13:59:57

这里也有同样的问题,在我将序列转换为nd.array和int后,成功地解决了这个问题。

您可以尝试如下操作:

代码语言:javascript
运行
复制
data['id_code'].values.astype(int)

--

更新:

如果值包含NaN,它仍然是错误的。似乎psycopg2不能解释np.int64格式,因此以下方法适用于我。

代码语言:javascript
运行
复制
import numpy as np
from psycopg2.extensions import register_adapter, AsIs
psycopg2.extensions.register_adapter(np.int64, psycopg2._psycopg.AsIs)
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50626058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档