2015-06-19 31 views
3

我有一個包含了微秒的分辨率時間戳一個MySQL表:如何將MySQL時間戳(6)讀入熊貓?

+----------------------------+------+ 
| time      | seq | 
+----------------------------+------+ 
| 2015-06-19 02:17:57.389509 | 0 | 
| 2015-06-19 02:17:57.934171 | 10 | 
+----------------------------+------+ 

我想把它讀入數據幀的大熊貓。使用

import pandas as pd 
con = get_connection() 
result = pd.read_sql("SELECT * FROM MyTable;", con=con) 
print result 

返回NAT(不是時間):

time seq 
0 NaT 0 
1 NaT 10 

我怎麼能讀入一個時間戳?

+0

您能否給一些額外的信息? 1)你的熊貓版本是什麼? 2)什麼是「con」?它是一個sqlalchemy引擎嗎?或者連接? (它應該是一個sqlalchemy引擎)3)你可以顯示'con.execute('「SELECT * FROM MyTable;」)的輸出fetchall()'' – joris

+0

@joris,'它應該是一個sqlalchemy引擎'不是一定是真的。對於'read_sql()',可以提供'sqlite3'' DBAPI2'對象,對嗎? –

+0

啊,是的,這是真的! (不是正式的,但確實有效),但仍然很有趣。然後你用'read_sql_table'給出的例子將不起作用。編輯:請注意,SQLite是一個例外,爲此DBAPI連接正式支持,也寫作框架,其他數據庫類型它只會用於讀取查詢,而不是讀取或寫入表。 – joris

回答

5

一般來說,要轉換時間戳,您可以使用pandas.to_datetime()

>>> import pandas as pd 
>>> pd.to_datetime('2015-06-19 02:17:57.389509') 
Timestamp('2015-06-19 02:17:57.389509') 

docs,從SQL在閱讀的時候,你可以明確地強制列被解析爲日期:

pd.read_sql_table('data', engine, parse_dates=['Date']) 

或更明確,指定格式字符串,或參數的字典傳遞給pandas.to_datetime()

pd.read_sql_table('data', engine, parse_dates={'Date': '%Y-%m-%d'}) 

pd.read_sql_table('data', engine, parse_dates={'Date': {'format': '%Y-%m-%d %H:%M:%S'}}) 

添加概念的快速證明。注意,我正在使用SQLITE。假設你存儲的時間戳作爲字符串:

from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData 
import pandas as pd 

engine = create_engine('sqlite:///:memory:', echo=True) 

datapoints = [{'ts': '2015-06-19 02:17:57.389509', 'seq': 0}, 
       {'ts':'2015-06-19 02:17:57.934171', 'seq': 10}] 
metadata = MetaData() 
mydata = Table('mydata', metadata, 
    Column('ts', String), 
    Column('seq', Integer), 
) 
metadata.create_all(engine) 
ins = mydata.insert() 
conn = engine.connect() 
conn.execute(ins, datapoints) 

foo = pd.read_sql_table('mydata', engine, parse_dates=['ts']) 
print(foo) 

輸出:

      ts seq 
0 2015-06-19 02:17:57.389509 0 
1 2015-06-19 02:17:57.934171 10 

或者,如果你是其中存儲爲datetime對象,它的工作原理是相同的(代碼差異是我得到的數據轉換成在datetime格式的數據庫):

from datetime import datetime 
from sqlalchemy import create_engine, Table, Column, Integer, DateTime, MetaData 
import pandas as pd 

engine = create_engine('sqlite:///:memory:', echo=True) 

datapoints = [{'ts': datetime.strptime('2015-06-19 02:17:57.389509', '%Y-%m-%d %H:%M:%S.%f'), 'seq': 0}, 
       {'ts':datetime.strptime('2015-06-19 02:17:57.934171', '%Y-%m-%d %H:%M:%S.%f'), 'seq': 10}] 
metadata = MetaData() 
mydata = Table('mydata', metadata, 
    Column('ts', DateTime), 
    Column('seq', Integer), 
) 
metadata.create_all(engine) 
ins = mydata.insert() 
conn = engine.connect() 
conn.execute(ins, datapoints) 

foo = pd.read_sql_table('mydata', engine, parse_dates=['ts']) 
print(foo) 

輸出相同:

      ts seq 
0 2015-06-19 02:17:57.389509 0 
1 2015-06-19 02:17:57.934171 10 

希望這會有所幫助。

編輯嘗試解決@joris關注的問題,這是事實sqlite存儲所有datetime對象爲字符串,但是內置適配器自動轉換這些回datetime對象時取出。擴展與第二個例子:

from sqlalchemy.sql import select 
s = select([mydata]) 
res = conn.execute(s) 
row = res.fetchone() 
print(type(row['ts'])) 

結果<class 'datetime.datetime'>

+0

我試過你的例子,但它仍然導致'NaT' – ThS

+0

當我回到我的電腦時,我會再看一次。 –

+0

@ThS,你的'時間'存儲爲什麼類型?字符串或日期時間? –