2016-04-04 21 views
0

Veri sayfalarımdaki veri zamanlarını TSQL Tablomumun datetime sütunlarına aktarmaya çalışıyorum.Tarih saat değerlerini TSQL'e aktarırken geçersiz tarih formatı (0)

sorun benim sütunların herhangi

aşağıya bakınız 'Nat' NULL değeri içeriyorsa bir hata alıyorum olmasıdır:

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

O null değerleri ile ilgisi var benim datetime sütunları. Veri çerçevemde boş değerleri görüntülediğimde NaT olarak görünürler.

TSQL Tablosuna hiçbir şeyimi nasıl ithal edeceğimi bilmiyorum. Bunun gibi bir NULLIF() deyimiyle

cevap

0

değişiklik INSERT INTO (...) SELECT ... için 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

NaT bir numpy.datetime64 türü olarak boş temsilini değildir-bir kez, temsil eder. datetime64 türü, pyodbc'nin beklediği None değerini desteklemez.

Dışa dataframe

dicts ( rows) listesi üzerinde bir O 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}]

döngü datetime64 gelen tip dönüşüm idare edecek DataFrame.to_dict yöntem kullanılarak dict ve normal olarak pyodbc ile eklemek için kullanılır. Herhangi bir SQL modifikasyonu gerektirmez.

İlgili konular