psycopg2:can';t适应类型';numpy.int64';

psycopg2:can';t适应类型';numpy.int64';,numpy,psycopg2,Numpy,Psycopg2,我有一个数据帧,其数据类型如下所示,我想将该数据帧插入postgres DB,但由于错误无法调整类型“numpy.int64” 如何将这些类型转换为本机python类型,例如从int64(本质上是“numpy.int64”)转换为postgres可以通过psycopg2客户端接受的经典int data['id_code'].astype(np.int) defaults to int64 尽管如此,还是可以从一种numpy类型转换为另一种类型(例如从int转换为float) 更改为 dtyp

我有一个数据帧,其数据类型如下所示,我想将该数据帧插入postgres DB,但由于错误无法调整类型“numpy.int64”

如何将这些类型转换为本机python类型,例如从int64(本质上是“numpy.int64”)转换为postgres可以通过psycopg2客户端接受的经典int

data['id_code'].astype(np.int)  defaults to int64
尽管如此,还是可以从一种numpy类型转换为另一种类型(例如从int转换为float)

更改为

dtype: float64
最重要的是,如果有人知道如何将numpy数据类型转换为有帮助的经典类型,那么psycopg2似乎并不理解numpy数据类型

更新:插入到数据库

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

我不确定为什么您的数据列表包含NumPy数据类型,但当我运行您的代码时,同样的事情也会发生在我身上。下面是另一种构造数据列表的方法,以使整数和浮点数最终成为其本机python类型:

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

替代方法

我认为通过使用pandas,您可以在更少的代码行中完成同样的事情:


在代码中添加以下内容:

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)

同样的问题,在我将级数转换为nd.array和int之后,成功地解决了这个问题

您可以尝试以下操作:

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

更新:

如果该值包含NaN,则仍然错误。 似乎psycopg2无法解释
np.int64
格式,因此以下方法适合我

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


你能把代码显示在插入的地方吗?@Michael sure,更新了问题的描述。你试过将id_代码定义为BIGINT吗?如果你的意思是在DB端将其定义为BIGINT,不,我没有尝试这种方法,因为我知道问题在于psycopg2客户端没有将numpy类型映射到python本地版本
data=[[1],[2]]
df=pd.DataFrame(data)
print(type(df.iloc[0][0]))
在我的环境中生成结果,使用理解生成列表仍然会生成numpy数据类型:
in[341]:type([list(row)用于data.itertuples中的row)(index=False)[0][0])Out[341]:numpy.int64
实际上注意到,尽管有numpy数据类型,pyscopg2对根据建议理解生成的数据列表进行解析时没有任何问题。如何在postgresql数据库中插入numpy?这对我很有效。谢谢!
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)
data['id_code'].values.astype(int)
import numpy as np
from psycopg2.extensions import register_adapter, AsIs
psycopg2.extensions.register_adapter(np.int64, psycopg2._psycopg.AsIs)