Pandas to_sql 当列包含空值时忽略 dtype

Pandas to_sql ignoring dtype when column contains null values

第一个问题。我希望这已经足够描述了。

Pandas 0.25,甲骨文 11g

我有一个从 csv 中读取的数据框。它包含数字、字符串和日期数据的混合。

我使用 .astype(str).astype(int).to_datetime.

在数据框中强制数据类型

然后我创建一个 dtype 字典 select 我想要的数据类型。

当数字列 types.NUMBERtypes.INTEGER 中有一些空值时,在 Oracle table 中创建一个 FLOAT。它应该是 NUMBER(38,0),特别是如果我使用 types.INTEGER。定义为 types.NUMBER 并包含所有非空整数的键列按预期创建为 NUMBER(38,0)

当列的所有值为空值,但已应用 .astype(str) 且 dtype 为 types.VARCHAR(300) 时,这些列也在 Oracle 中创建为 FLOAT

我需要在 to_sql 中使用 if_exists='append',因为 table 收集历史记录,所以我等不及 VARCHAR 列接收数据。尽管我在测试期间一直在使用 if_exists='replace 以确保删除并重新创建 table。

有没有办法解决这些由数据中的空值引起的问题,导致数据类型 selection 不正确?我不应该需要在字符串中使用空格(即 '')和整数 0,我需要空值作为空值。

日期列中的空值,即使整个列都是空值也有效,并根据要求在 Oracle 中创建 DATE

编辑:字符串到 VARCHAR 问题实际上是一个被困和错误处理的异常问题。

数字仍然是一个必须单独处理的问题我会在解决方案中添加一个答案。

具有一些空值和一些非空值的数字字段的问题是由于 Pandas 使用 NaN 表示空值,而 numpy 将 NaN 视为浮点数。

.astype(int) 不处理 NaN,实际上由于 NaN 引发异常(在我的例子中,try 块捕获并处理不正确)。

解决方法是:df['pref1'] = df['pref1'].astype('Int64')

'Int64'需要大写'I'。 .astype('int64') 也不行。

This answer was helpful