2016-04-04 5 views
0

Ich versuche, Datetime-Werte aus meinem Pandas-Datenframe in die Datetime-Spalten meiner TSQL-Tabelle zu importieren.Ungültiges Datumsformat (0) beim Importieren von Datetime-Werten in TSQL

Das Problem ist, dass ich einen Fehler, wenn eine meiner Spalten einen Nullwert enthalten ‚NaT‘

siehe unten:

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

Es hat mit Null-Werte in meinem zu tun datetime Spalten. Wenn ich die NULL-Werte in meinem Datenrahmen anzeigen, erscheinen sie als NaT.

Ich weiß nicht, wie man nichts in meine TSQL-Tabelle importiert.

Antwort

0

Änderung der INSERT INTO (...) VALUES (...) zu INSERT INTO (...) SELECT ... mit einer NULLIF() Aussage wie folgt:

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

NaT stellt nicht-A-Zeit, die die Darstellung von null als numpy.datetime64 Typ ist. Der Typ datetime64 unterstützt keinen Wert von None, den pyodbc erwartet.

Export der Datenrahmen DIKT DataFrame.to_dict Verfahren verwendet wird, die den Typ Umwandlung von datetime64 an einen 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}]

dann die Schleife durch die Liste der dicts (rows) und Einsatz mit Pyodbc als normal behandelt. Erfordert keine SQL-Änderungen.

Verwandte Themen