当我将“日期”变量从 SQL Server 拉入 Python/Pandas 时,它作为“对象”出现。我已经安装并尝试了多个驱动程序(代码中显示了尝试过的注释驱动程序),每次都有相同的结果:
import pandas as pd
import pyodbc
conn_str = (
r'Driver={SQL Server Native Client 11.0};'
# r'Driver={SQL Server Native Client 10.0};'
# r'Driver={ODBC Driver 11 for SQL Server};'
# r'Driver={ODBC Driver 13 for SQL Server};'
# r'Driver={SQL Server};'
r'Server=MyServer;'
r'Database=MyDB;'
r'Trusted_Connection=yes;'
)
cnxn = pyodbc.connect(conn_str)
sql = (
"Select cast('2017-08-19' as date) [DateVar]"
", cast('2017-08-19' as datetime) [DateTimeVar]"
", cast('2017-08-19' as datetime2) [DateTime2Var]"
)
d2 = pd.read_sql(sql,cnxn)
cnxn.close()
print(d2.dtypes)
返回结果为:
DateVar object
DateTimeVar datetime64[ns]
DateTime2Var datetime64[ns]
dtype: object
我希望 DateVar 是一个日期时间。有什么想法为什么会发生这种情况吗?
和这个人有同样的问题:pyodbc 将 SQL Server DATE 字段作为字符串返回 https://stackoverflow.com/questions/7172540/pyodbc-returns-sql-server-date-fields-as-strings但他的解决方法是使用我已经安装的 {SQL Server Native Client 10.0},但它对我不起作用。
我连接的 SQL Server 版本是:
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)
Oct 20 2015 15:36:27
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
UPDATES
1>
根据Max的输入,尝试了sqlalchemy,但没有运气,这仍然给了我一个字符串:
import sqlalchemy as sa
engine = sa.create_engine('mssql+pyodbc://MyDatabase/MyDB?driver=SQL+Server+Native+Client+10.0')
d2 = pd.read_sql(sql, engine)
2>
根据 Flipper 的 Q,仅使用 Pyodbc 游标完成了此操作,看起来在使用 Native Client 11.0 时游标中返回了正确的日期数据类型:
(('DateVar', datetime.date, None, 10, 10, 0, True),
('DateTimeVar', datetime.datetime, None, 23, 23, 3, True),
('DateTime2Var', datetime.datetime, None, 27, 27, 7, True))
这表明问题出在 Pandas 对 dtype 的处理中日期时间.日期加载到数据帧时。