我有一个具有如下所示数据类型的数据帧,我想将该数据帧插入到postgres DB中,但由于出现错误can't adapt type '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数据类型,如果有人知道如何将它们转换为经典类型的话。
更新:插入到数据库
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()
发布于 2018-06-01 02:15:06
我不确定为什么您的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)
发布于 2019-05-31 15:27:53
在您的代码中添加以下内容:
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)
发布于 2019-06-26 13:59:57
这里也有同样的问题,在我将序列转换为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)
https://stackoverflow.com/questions/50626058
复制相似问题