我正在尝试从 teradata db 获取数据,并获得了浮点数的 NaN 值,但是如果我在 SQL 脚本中使用 cast(val 作为浮点数(,它工作正常。我该如何解决它?
法典:
import teradata
udaExec = teradata.UdaExec(appName = 'sel', version = '1.0', logConsole=False)
session = udaExec.connect(method='odbc',
system = 'db,
username = 'usr,
password='psw',
driver= 'Teradata',
charset='UTF8'
)
pd.read_sql('select 100000.0 as float_, 100000 as number_, cast(100000.0 as float) as float_cast', session)
输出:
float_ number_ float_cast
NaN 100000.0 100000.0
我在同样的问题上挣扎了几个小时。事实证明,在不更改 teradata 模块的情况下解决此问题非常容易。
只需添加 USEREGIONALSETTINGS 参数:
session = udaExec.connect(
method= 'odbc'
, driver = 'Teradata'
, charset = 'UTF8'
, dsn=dsn
, USEREGIONALSETTINGS='N'
, username=username
, password=password
)
之后,你应该得到你想要的:
float_ number_ float_cast
0 100000.0 100000.0 100000.0
问题是 Teradata 将 100000.0 作为 100000,0 返回,因此无法将其转换为数字。因此,您可以编辑 datatypes.py 文件并在点上添加替换逗号:
if value is not None:
#added row below
value = str(value).replace(",", ".")
if typeCode == NUMBER:
try:
return NUMBER(value)
except:
# Handle infinity and NaN for older ODBC drivers.
if value == "1.#INF":
return NUMBER('Infinity')
elif value == "-1.#INF":
return NUMBER('-Infinity')
else:
return NUMBER('NaN')
可能这有点野蛮,但它有效。
附言:编辑文件后不要忘记重新启动python datatypes.py 核心。