【问题标题】:Invalid date format (0) when importing datetime values to TSQL将日期时间值导入 TSQL 时日期格式 (0) 无效
【发布时间】:2016-04-04 20:10:36
【问题描述】:

我正在尝试将我的 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)')

这与我的日期时间列中的 Null 值有关。当我在我的数据框中查看空值时,它们显示为 NaT。

我不知道如何向我的 TSQL 表导入任何内容。

【问题讨论】:

    标签: python tsql pyodbc


    【解决方案1】:

    使用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() 
    

    【讨论】:

      【解决方案2】:

      NaT 表示 not-a-time,即 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}]

      然后循环遍历字典列表 (rows) 并像往常一样使用 pyodbc 插入。不需要任何 SQL 修改。

      【讨论】:

        猜你喜欢
        • 2016-10-05
        • 2023-01-22
        • 2017-07-18
        • 2017-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-10
        相关资源
        最近更新 更多