2016-07-13 5 views
0

pyodbcを使用してSQLデータベースからデータを取得しようとしていて、numpy.arrayに配置したい。しかし、np.fromiter()の引数に複数のデータ型を入力するのが難しいと感じました。pyodbc Numpy配列へのSQL照会typeerror:バイトのようなオブジェクトが必要

import pyodbc as od 
import numpy as np 

con = od.connect('DSN=dBASE; UID=user; PWD=pass') 
cursor = con.cursor() 
SQLCommand = (
    """ 
    SELECT 

     [Item No_] 
     ,sum ([Quantity]) as TotQty 
     ,sum ([Discount Amount]) as DiscAmount 
     ,sum ([Cost Amount]) as CostAmount 
     ,[Date] 
     ,sum ([Net Amount]) as NetAmount 
     ,sum ([VAT Amount]) as VATAmount 
     ,sum ([Refund Qty_]) as RefundQty 


    FROM database 
    where [DATE] between ('2015-12-01 00:00:00.000') and ('2015-12-31 00:00:00.000') and [area No_] = '123' 
    group by ROLLUP([DATE],[Item No_]); 

    """) 

cursor.execute(SQLCommand) 
results = cursor.fetchall() 
results_as_list = [i[0] for i in results] 
array = np.fromiter(results_as_list, dtype="str, float, float, datetime64,float,float,float") 
print(array[:5,:]) 

そして、私はあなたが複数のdtypesで、1回の反復可能な、クエリの特に最初の列を渡すためにしようとしている

TypeError: a bytes-like object is required, not 'str' 

答えて

0

このエラーが発生します。 Numpy.iter()は、1つのオブジェクトとタイプしか取りません。クエリ結果セットの各列を1次元の反復可能なものとして渡すことを検討してください。また、文字列(可変長)の場合は、長さを指定する必要があり、日付には[D]日付のみ、または時刻が[s]の場合は接尾辞を含めます。

cursor.execute(SQLCommand) 
results = cursor.fetchall() 

array = [np.fromiter([i[0] for i in results], dtype="|S50"), 
     np.fromiter([i[1] for i in results], dtype="float"), 
     np.fromiter([i[2] for i in results], dtype="float"), 
     np.fromiter([i[3] for i in results], dtype="float"), 
     np.fromiter([i[4] for i in results], dtype="datetime64[s]"), 
     np.fromiter([i[5] for i in results], dtype="float"), 
     np.fromiter([i[6] for i in results], dtype="float"), 
     np.fromiter([i[7] for i in results], dtype="float")] 

また、行列の配列を作成しました:

array = np.array([np.matrix([i[0] for i in results], dtype="str"), 
        np.matrix([i[1] for i in results], dtype="float"), 
        np.matrix([i[2] for i in results], dtype="float"), 
        np.matrix([i[3] for i in results], dtype="float"), 
        np.matrix([i[4] for i in results], dtype="str"), 
        np.matrix([i[5] for i in results], dtype="float"), 
        np.matrix([i[6] for i in results], dtype="float"), 
        np.matrix([i[7] for i in results], dtype="float")]) 
+0

おかげで、それが動作します!私はまた、 "| S50"の意味を知ってもいいですか、私はそれをgoogleにしようとしましたが、それに関する参考文献は見つかりませんでした。 – Windalfin

+0

素晴らしい!これは、デフォルトでは可変長のdtypeであるため、[文字列の制限](http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html)を設定しています。ここでは、50文字が使用されています。必要に応じて調整します。 – Parfait

関連する問題