我有一个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()
4条答案
按热度按时间ryevplcw1#
在代码中的某个地方添加以下内容:
5kgi1eie2#
更新日期:
如果值中包含
NaN
,它仍然是错误的。似乎psycopg2
不能解释np.int64
,下面的方法对我有用。原答复:
同样的问题在这里,成功地解决了这个问题后,我转换系列到nd.array和int。
您可以尝试以下操作:
--
oiopk7p53#
我不确定为什么你的data_list包含NumPy数据类型,但当我运行你的代码时,同样的事情也发生在我身上。这里是构造data_list的另一种方法,以便整数和浮点数最终成为它们的原生Python类型:
替代方法
我认为你可以通过使用pandas to_sql来用更少的代码行完成同样的事情:
e4eetjau4#
我遇到了同样的问题,并使用以下方法修复了它:
df = df.convert_dtypes()