微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – SQL Server DATE作为字符串检索到pandas中

当我从sql Server将“Date”变量拉入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 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)

更新

1 GT;

基于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 datetime.date.

解决方法:

使用pandas.read_sql的parse_dates参数指定在数据帧加载时将DateVar列值显式转换为datetime.

更新了原始代码段:

...
d2 = pd.read_sql(sql=sql,
                 con=cnxn,
                 # explicitly convert DATE type to datetime object
                 parse_dates=["DateVar"])

cnxn.close()

print(d2.dtypes)

返回

DateVar         datetime64[ns]
DateTimeVar     datetime64[ns]
DateTime2Var    datetime64[ns]
dtype: object

在Windows上使用pyodbc 4.0.17,pandas 0.20.3和sql Server 2014进行了测试.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐