【问题标题】:How to resolve cx_Oracle.DatabaseError: DPI-1043: invalid number error?如何解决 cx_Oracle.DatabaseError: DPI-1043: invalid number 错误?
【发布时间】:2020-05-21 02:48:12
【问题描述】:

我有一个这样的熊猫 df:

      A         B       C             D            E       F        G        H
0  1033548.0   0.0  20190324.0   2019-04-13       NaT   10176.0    NaN  40360001.0
1  1033549.0   0.0  20190324.0   2019-04-13 2019-04-13   10182.0    NaN  41360562.0
2  1033550.0   0.0  20190324.0   2019-04-13       NaT   10433.0    NaN  45180156.0
3  1033551.0   0.0  20190324.0   2019-04-13       NaT   10019.0    123         NaN
4  1033552.0   0.0  20190324.0   2019-04-13       NaT   10333.0    NaN  40120165.0
5  1033553.0   0.0  20190324.0   2019-04-13       NaT   10246.0    NaN  40820596.0 
6  1033554.0   0.0  20190324.0          NaT       NaT   10107.0    NaN         NaN
7  1033555.0   0.0  20190324.0   2019-04-13       NaT   10131.0    NaN  41190549.0
8  1033556.0   0.0  20190324.0   2019-04-13       NaT   10057.0    NaN  40430581.0
9  1033557.0   0.0  20190324.0   2019-04-13       NaT   10009.0    NaN  40360012.0 

我想使用SQL Insert Statement 将此df 写入我的Oracle Database Table。但由于我的 df 包含 NaN 和 NaT,所以它给了我错误:cx_Oracle.DatabaseError: DPI-1043: invalid number。 如何使用不会给我任何错误的 SQL 将此 df 写入 oracle 表? 任何帮助将不胜感激。

【问题讨论】:

标签: sql pandas oracle


【解决方案1】:

普拉奇。

您的列G 在Oracle 中属于number 类型,对吗?因此,如果可能,我认为您需要将 NaNs 设置为 0(零)。

或者制作两种类型的插入:

  1. 带有G列,如果它存在于DF上;
  2. 没有列G,如果它存在于DF

【讨论】:

    【解决方案2】:

    你必须在绑定列表中用 None 替换你的 {float} nan。

    import math
    
    bind_insert = lines_to_insert_df.values.tolist()
    
    for b in bind_insert :
    
        for index, value in enumerate(b):
            if isinstance(value, float) and math.isnan(value):
                b[index] = None
            elif isinstance(value, type(pd.NaT)):
                b[index] = None
    
    con.cursor().executemany(query, bind_insert)
    

    【讨论】:

    • 谢谢 elena.kim。非时间数据(Nat)也存在同样的问题。
    【解决方案3】:

    我有同样的问题。我认为这不是NaN 问题,因为它对我来说可以使用NaN 值。

    在我的例子中,由于除以 0,有一个具有 inf 值的浮点列。一旦我处理了这个问题,写入 Oracle 的问题就消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      相关资源
      最近更新 更多