我有一个带有如下所示dtypes的数据框,我希望将数据框插入到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数据类型,如果任何人有想法如何将它们转换为有用的经典类型。
更新:插入数据库
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()
答案 0 :(得分:1)
我不确定为什么你的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)
答案 1 :(得分:1)
这里是同样的问题,将序列转换为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)
答案 2 :(得分:0)
在代码中的以下位置添加
: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)