2014-09-01 95 views
1

我在将SQL日期时间从SQL Server数据库导入Pandas时遇到问题。使用Pandas/SQLAlchemy导入DateTime

我使用以下代码:

data = pd.read_sql('select top 10 timestamp from mytable',db) 

'MyTable的' 包含一列 '时间戳',它的类型DATETIME2的。

如果db是一个pyodbc数据库连接,这工作正常,我的时间戳返回为数据类型'datetime64 [ns]'。但是,如果db使用create_engine('mssql+pyodbc://...')创建的SQL Alchemy引擎,则在data中返回的时间戳类型为'object',并在我的代码中稍后导致问题。

任何想法为什么发生这种情况?我使用熊猫版本0.14.1,pyodbc版本3.0.7和SQL炼金术版本0.9.4。如何将数据强制转换为datetime64 [ns]?

+0

要强制执行此操作,可以使用'read_sql'的parse_dates'关键字(请参阅http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql_query.html)。但是这实际上并不是必须的,并且对我来说似乎是一个bug(在pandas或sqlalchemy中),你可以在https://github.com/pydata/pandas/issues上报告它吗? – joris 2014-09-01 15:08:54

+0

完成:https://github.com/pydata/pandas/issues/8156 – tobycoleman 2014-09-01 15:16:51

+0

你可以接受你自己的答案,就像你自己发现的一样。 – joris 2014-09-03 11:25:41

回答

2

原来问题来自SQL炼金术如何调用PyODBC。默认情况下,它将使用不支持DateTime2的'SQL Server'驱动程序。当我直接使用PyODBC时,我使用'SQL Server Native Client 10.0'驱动程序。

要获得正确的行为,即返回蟒蛇datetime对象,我需要创建SQL炼金术引擎如下:

import sqlalchemy as sql 
connectionString = 'mssql+pyodbc://username:[email protected]_server/my_database_name?driver=SQL Server Native Client 10.0' 
engine = sql.create_engine(connectionString) 

?driver=...部分势力SQL炼金术使用正确的驱动程序。