psycopg2:无法适应类型“numpy.int64”

ddhy6vgd  于 2023-03-30  发布在  其他
关注(0)|答案(4)|浏览(328)

我有一个dataframe与dtypes如下所示,我想插入dataframe到postgres数据库,但由于错误失败***不能适应类型'numpy.int64'***

id_code               int64
sector              object
created_date         float64
updated_date    float64

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

data['id_code'].astype(np.int)  defaults to int64

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

data['id_code'].astype(float)

更改为

dtype: float64

底线是psycopg2似乎不理解numpy数据类型,如果有人知道如何将它们转换为经典类型会有所帮助。
更新:插入DB

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()
ryevplcw

ryevplcw1#

在代码中的某个地方添加以下内容:

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)
5kgi1eie

5kgi1eie2#

更新日期:

如果值中包含NaN,它仍然是错误的。似乎psycopg2不能解释np.int64,下面的方法对我有用。

import numpy as np
from psycopg2.extensions import register_adapter, AsIs
register_adapter(np.int64, AsIs)

原答复:
同样的问题在这里,成功地解决了这个问题后,我转换系列到nd.array和int。
您可以尝试以下操作:

data['id_code'].values.astype(int)

--

oiopk7p5

oiopk7p53#

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

data_list = [list(row) for row in data.itertuples(index=False)]

替代方法

我认为你可以通过使用pandas to_sql来用更少的代码行完成同样的事情:

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)
e4eetjau

e4eetjau4#

我遇到了同样的问题,并使用以下方法修复了它:df = df.convert_dtypes()

相关问题