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

标签 python sql-server pandas pyodbc

当我将“日期”变量从 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 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>

根据 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_sqlparse_dates 参数指定 DateVar 列值在数据帧加载时显式转换为日期时间。

更新的原始代码片段:

...
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 进行测试。

关于python - SQL Server DATE 作为字符串检索到 pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45773871/

相关文章:

sql - Float 在数据库 Sql Server 中存储为 Real

sql-server - 在 SQL Server 中查询 json 键名

c# - 如何在类库项目中首先使用 EF Core Code 创建数据库

Python pandas 数据透视 matplotlib

excel - xlwings 与 pandas 本地导出与多索引数据帧 : how to reconcile?

Python 命令行应用程序,无需运行以 python <filename> 开头的命令

python - 如何仅向 python 询问新 key :value pairs?

python - 一种在多个数据集中映射数据的更好方法,具有多个数据映射规则

python - 假设分布未知,根据样本数据计算置信区间

python - 使用 scikit Pipeline 测试模型但仅预处理一次数据