2017-05-26 4 views
0

私はteradata dbからデータを取得しようとしていますが、floatのNaN値を取得しますが、SQLスクリプトでcast(valをfloat)どうすれば修正できますか?teradataのpythonモジュール、NaNとして浮動小数点を使用する

コード:

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 
+0

** 1 **フロートは悪です。 ** 2。**おそらく私のJavaプログラマーですが、暗黙のキャストや弱いタイプの入力が嫌いです。 ** 3。**それを鋳造する際の問題は何ですか? – Andrew

+0

カラム数が少ない場合はキャストは問題ありませんが、10個以上の浮動カラムが必要な場合は迷惑になることがあります。 –

答えて

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') 

が、それは少し野蛮な方法だかもしれませんが、それは動作します。

P.S. datatypes.pyファイルの編集後にpython coreを再起動するのを忘れないでください。

0

私は数時間同じ問題で苦労しました。 Teradataモジュールを変更せずにこれを修正するのは簡単です。あなたが欲しかったものを手に入れる必要があるその後

session = udaExec.connect(
     method= 'odbc' 
     , driver = 'Teradata' 
     , charset = 'UTF8' 
     , dsn=dsn 
     , USEREGIONALSETTINGS='N' 
     , username=username 
     , password=password 
     ) 

ちょうどUSEREGIONALSETTINGSパラメータを追加します。

float_  number_  float_cast 
0 100000.0 100000.0 100000.0 
関連する問題