我正在尝试将具有毫秒时间戳的DataFrame
放入MySQL
数据库。然而,当这样做时,毫秒部分似乎被丢弃了。我已经创建了一个工作示例来展示正在发生的事情:
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)
将DataFrame
中创建的pandas
的日期时间与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
您可以清楚地看到毫秒被删除。有什么方法可以改变代码来保持毫秒级的部分吗?
编辑:我正在使用MySQL Workbench 6.2和pandas 0.14.1
答案 0 :(得分:3)
如评论中所述,您需要MySQL v5.6.4 +支持小数秒(docs)。
但是,正如docs解释的那样,您需要明确指定为DATETIME(fsp)
,其中fsp
是小数秒精度,以便在datetime列中启用它。
to_sql
中的默认值是使用DateTime
(默认的sqlalchemy日期时间类型)。但是,您可以使用dtype
参数覆盖此默认值,并使用指定精度的MySQL specific DATETIME
类型:
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
注意:此dtype
参数需要pandas 0.15.2+。