第一个问题。我希望这足够描述性。
Pandas 0.25,Oracle 11g
我有一个从csv读取的数据帧。它包含数字、字符串和日期数据的混合。
我使用.astype(str)、.astype(int)和.to_datetime在数据帧中强制使用数据类型。
然后,我创建一个dtype字典来选择我想要的数据类型。
当数值列中有一些空值时,types.NUMBER和types.INTEGER会在Oracle表中创建一个FLOAT。它应该是NUMBER(38,0),特别是当我使用types.INTEGER的时候。定义为types.NUMBER且包含所有非空整数的键列被创建为NUMBER(38,0)。
如果存在全部为空的列,但应用了.astype(str),并且数据类型为types.VARCHAR(300),则这些列也将在Oracle中创建为FLOAT。
我需要在to_sql中使用if_exists='append',因为表收集历史记录,所以我不能等待VARCHAR列接收数据。尽管我在测试期间一直使用if_exists='replace来确保表被删除并重新创建。
有没有办法解决这些问题,这些问题是由数据中的空值引起的,从而导致数据类型选择不正确?我不应该需要在字符串中使用空格(即'')和0来表示整数,我需要空值来作为空值。
日期列中的空值,即使整个列都为空值也是如此,并根据请求在Oracle中创建一个DATE。
编辑:字符串到VARCHAR的问题实际上是一个带有陷阱和错误处理的异常的问题。
数字仍然是一个必须单独处理的问题,我将在解决方案中添加一个答案。
发布于 2020-07-24 18:10:44
带有一些null和一些非NULL值的数值字段的问题是由于Pandas使用NaN表示null,而numpy将NaN视为浮点数。
.astype(int)不处理NaN,实际上由于NaN引发了一个异常(在我的例子中,try块捕获并错误地处理了它)。
解决方案是:df['pref1'] = df['pref1'].astype('Int64')
“Int64”需要大写的“i”。.astype('int64')也不能工作。
https://stackoverflow.com/questions/63069276
复制相似问题