2016-04-04 8 views
0

)私のpandasデータフレームからdatetime値をTSQLテーブルのdatetime列にインポートしようとしています。datetime値をTSQLにインポートするときの日付形式が無効です(

問題は私の列のいずれかがNULL値が含まれている場合、私はエラーを取得することです「のNaT」

は以下を参照:

import pyodbc 
import pandas as pd 

cnxn = pyodbc.connect(driver='{SQL Server Native Client 10.0}', 
         host=server,database=dbname, 
         trusted_connection=tcon, 
         user=uname,password=pword) 

cursor = cnxn.cursor() 

df.head() 
      Date_1   Date_2 
1 2015-07-01 10:53:16 2015-07-01 00:13:09 
2 2015-07-03 10:31:16 2015-07-01 16:39:40 
3 2015-06-26 14:39:19 2015-06-24 13:56:17 

for index, row in df.iterrows(): 
cursor.execute(""" 
INSERT INTO Table(
Date1,Date2)""" 
"""VALUES (?,?)""", 
row['Date1'],row['Date2']) 

cnxn.commit() 

DataError: ('22007', '[22007] [Microsoft][SQL Server Native Client 10.0]Invalid date format (0) (SQLExecDirectW)')

それは私の中にNULL値に関係していますdatetimeカラム。私のデータフレームでnull値を見ると、NaTと表示されます。

TSQLテーブルに何もインポートする方法がわかりません。そうのようなNULLIF()ステートメントで

答えて

0

変化INSERT INTO (...) SELECT ...INSERT INTO (...) VALUES (...)

import pyodbc 
import pandas as pd 

cnxn = pyodbc.connect(driver='{SQL Server Native Client 10.0}', 
         host=server,database=dbname, 
         trusted_connection=tcon, 
         user=uname,password=pword) 

cursor = cnxn.cursor() 

df.head() 
      Date_1   Date_2 
1 2015-07-01 10:53:16 2015-07-01 00:13:09 
2 2015-07-03 10:31:16 2015-07-01 16:39:40 
3 2015-06-26 14:39:19 2015-06-24 13:56:17 

for index, row in df.iterrows(): 
cursor.execute(""" 
INSERT INTO Table(
Date1,Date2)""" 
"""SELECT NULLIF(?,'NaT'),NULLIF(?,'NaT') """, 
row['Date1'],row['Date2']) 

cnxn.commit() 
0

NaTnumpy.datetime64型としてヌルの表現であり、未時間を表します。 datetime64タイプでは、Noneの値はサポートされていません。これはpyodbcが想定しています。

エクスポートdicts(rows)のリストをループそしてdatetime64からdatetime.datetime

>>> df 
         Date_1 Date_2 
1 2016-04-04 15:50:40.794355 None 
2 2016-04-04 15:50:40.794355 None 
3 2016-04-04 15:50:40.794355 None 
>>> rows = df.to_dict(orient="records") 
>>> pprint(rows) 
[{'Date_1': Timestamp('2016-04-04 15:50:40.794355'), 'Date_2': None}, 
{'Date_1': Timestamp('2016-04-04 15:50:40.794355'), 'Date_2': None}, 
{'Date_1': Timestamp('2016-04-04 15:50:40.794355'), 'Date_2': None}]

に型変換を処理するDataFrame.to_dict方法を用いてのdictと通常通りpyodbcと挿入するデータフレーム。 SQLを変更する必要はありません。