一般來說,要轉換時間戳,您可以使用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'>
您能否給一些額外的信息? 1)你的熊貓版本是什麼? 2)什麼是「con」?它是一個sqlalchemy引擎嗎?或者連接? (它應該是一個sqlalchemy引擎)3)你可以顯示'con.execute('「SELECT * FROM MyTable;」)的輸出fetchall()'' – joris
@joris,'它應該是一個sqlalchemy引擎'不是一定是真的。對於'read_sql()',可以提供'sqlite3'' DBAPI2'對象,對嗎? –
啊,是的,這是真的! (不是正式的,但確實有效),但仍然很有趣。然後你用'read_sql_table'給出的例子將不起作用。編輯:請注意,SQLite是一個例外,爲此DBAPI連接正式支持,也寫作框架,其他數據庫類型它只會用於讀取查詢,而不是讀取或寫入表。 – joris