Pandas: milisegundos perdidos al escribir datos en MySQL

Estoy tratando de obtener un DataFrame con marcas de tiempo de milisegundos en una MySQL datos MySQL . Sin embargo, al hacer esto, la parte de milisegundos parece ser eliminada. He creado un ejemplo de trabajo para mostrar lo que está pasando:

 import pandas as pd from sqlalchemy import create_engine # database connection #Generate date_time with millisecond resolution and price column df=pd.DataFrame({'date_time' : pd.date_range('1/1/2000 09:00:00', freq="5ms",periods=100),'price' : np.random.random_sample(100)}) #Connect with an empty MySQL database (which I simply created using CREATE DATABASE trading_db;) disk_engine = create_engine("mysql+mysqldb://root:"+'MYPASSWORD'+"@localhost/trading_db") #Dataframe to SQL in a Table called trading_data df.to_sql('trading_data', disk_engine, if_exists='replace',index=False) #When I read this back from MySQL, the milliseconds seem to dissapear df_sql = pd.read_sql_query('SELECT *' 'FROM trading_data ' 'LIMIT 20', disk_engine) 

Compare la fecha y hora del DataFrame creado en pandas con los cargados desde MySQL :

 df.head() date_time price 0 2000-01-01 09:00:00 0.371986 1 2000-01-01 09:00:00.005000 0.625551 2 2000-01-01 09:00:00.010000 0.631182 3 2000-01-01 09:00:00.015000 0.625316 4 2000-01-01 09:00:00.020000 0.522437 df_sql.head() date_time price 0 2000-01-01 09:00:00 0.371986 1 2000-01-01 09:00:00 0.625551 2 2000-01-01 09:00:00 0.631182 3 2000-01-01 09:00:00 0.625316 4 2000-01-01 09:00:00 0.522437 

Como se puede ver claramente los milisegundos se caen. ¿Hay alguna manera en que pueda alterar el código para mantener la parte de milisegundos?

Edición: estoy usando MySQL Workbench 6.2 y pandas 0.14.1

Como se señaló en los comentarios, necesita MySQL v5.6.4 + para el soporte de segundos fraccionarios ( docs ).
Pero, como explican los documentos , debe especificar esto explícitamente como DATETIME(fsp) , donde fsp es la precisión fraccional de segundos, para habilitar esto en la columna de fecha y hora.

El valor predeterminado en to_sql es usar DateTime (el tipo de fecha y hora sqlalchemy predeterminado). Sin embargo, puede anular este valor predeterminado con el argumento dtype y usar el tipo DATETIME específico de MySQL especificando la precisión:

 In [11]: from sqlalchemy.dialects.mysql import DATETIME In [12]: df.to_sql('trading_data', engine, dtype={'date_time': DATETIME(fsp=6)}, if_exists='replace', index=False) In [13]: df_sql = pd.read_sql_query('SELECT * FROM trading_data', engine) In [14]: df_sql.head() Out[14]: date_time price 0 2000-01-01 09:00:00 0.152087 1 2000-01-01 09:00:00.005000 0.927375 2 2000-01-01 09:00:00.010000 0.540021 3 2000-01-01 09:00:00.015000 0.499529 4 2000-01-01 09:00:00.020000 0.797420 

Nota: necesitas pandas 0.15.2+ para este argumento dtype .