我正在尝试将我的pandas数据帧中的日期时间值导入到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]日期格式无效(0)(SQLExecDirectW)')
它与我的datetime列中的Null值有关。当我在数据框中查看空值时,它们显示为NaT。
我不知道如何不向我的TSQL表导入任何内容。
答案 0 :(得分:0)
使用NULLIF()语句将INSERT INTO (...) VALUES (...)
更改为INSERT INTO (...) SELECT ...
,如下所示:
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()
答案 1 :(得分:0)
NaT
表示非一次性,它表示null为numpy.datetime64类型。 datetime64
类型不支持pyodbc期望的None
值。
使用DataFrame.to_dict方法将数据框导出到dict,该方法将处理从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}]
然后遍历dicts列表(rows
)并正常插入pyodbc。不需要任何SQL修改。