Importación de DateTime usando Pandas / SQLAlchemy

Tengo problemas para importar fechas de datos de una base de datos de SQL Server a Pandas.

Estoy usando el siguiente código:

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

‘MyTable’ contiene una columna ‘Timestamp’, que es de tipo DateTime2.

Si db es una conexión de base de datos pyodbc esto funciona bien, y mis marcas de tiempo se devuelven como tipo de datos ‘datetime64 [ns]’. Sin embargo, si db un motor de alquimia SQL creado con create_engine('mssql+pyodbc://...') , las marcas de tiempo devueltas en los data son de tipo ‘objeto’ y causan problemas más adelante en mi código.

¿Alguna idea de por qué sucede esto? Estoy usando pandas versión 0.14.1, pyodbc versión 3.0.7 y SQL alquimia versión 0.9.4. ¿Cómo puedo forzar mejor los datos en datetime64 [ns]?

Resulta que el problema se origina en cómo SQL Alchemy llama a PyODBC. De forma predeterminada, utilizará el controlador ‘SQL Server’, que no admite DateTime2. Cuando estaba usando PyODBC directamente, estaba usando el controlador ‘SQL Server Native Client 10.0’.

Para obtener el comportamiento correcto, es decir, devolver objetos datetime de Python, necesitaba crear el motor de alquimia de SQL de la siguiente manera:

 import sqlalchemy as sql connectionString = 'mssql+pyodbc://username:password@my_server/my_database_name?driver=SQL Server Native Client 10.0' engine = sql.create_engine(connectionString) 

La parte ?driver=... obliga a SQL Alchemy a usar el controlador correcto.