psycopg2:将带有 NaN 的 numpy 数组插入表中

问题描述 投票:0回答:1

以下代码可以很好地将多维 numpy 数组插入表中

def adapt_numpy_array(numpy_array):
    return AsIs(numpy_array.tolist())

register_adapter(np.ndarray, adapt_numpy_array)
register_adapter(np.int32, AsIs)
register_adapter(np.int64, AsIs)
register_adapter(np.float64, AsIs)

但是,如果数组包含 NaN,它就会中断:

psycopg2.errors.UndefinedColumn:FEHLER:Spalte »nan«存在 第 2 行:...6000.0、692000.0、732000.0、830000.0、928000.0]、[南、南、..

将适配器更改为

def adapt_numpy_array(numpy_array):
    return numpy_array.tolist()

def nan_to_null(f,
        _NULL=psycopg2.extensions.AsIs('NULL'),
        _Float=psycopg2.extensions.Float):
    if not np.isnan(f):
        return _Float
    return _NULL

register_adapter(float, nan_to_null)

产生另一个错误

AttributeError:“list”对象没有属性“getquoted”

为什么第二个代码会中断,psycopg2 应该遍历列表并用其值或 NULL 替换每个浮点数? 如果存在 NaN,如何将 numpy 数组插入到 SQL 表中?

postgresql psycopg2 numpy-ndarray
1个回答
0
投票

技巧是将 numpy 数组转换为字符串,并用

NULL
正确表示 NaN 值。然后,格式化的字符串可以由
AsIs
适配器包裹。

import numpy as np
from psycopg2.extensions import register_adapter, AsIs

def adapt_numpy_array(numpy_array):
    return AsIs(str(numpy_array.tolist()).replace("nan", "NULL"))

register_adapter(np.ndarray, adapt_numpy_array)

不确定这是否是最优雅的解决方案,但它确实可以处理我抛出的任何 numpy 数组。

© www.soinside.com 2019 - 2024. All rights reserved.