python - 如何将 MySQL timestamp(6) 读入 pandas?

标签 python mysql pandas

我有一个 MySql 表,其时间戳具有微秒分辨率:

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

我想将它读入 pandas Dataframe。使用

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  

如何将其读入时间戳?

最佳答案

一般来说,要转换时间戳,你可以使用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

或者,如果您将它们存储为日期时间对象,它的工作原理相同(代码差异是我将数据以日期时间格式导入数据库):

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'>

关于python - 如何将 MySQL timestamp(6) 读入 pandas?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30929471/

相关文章:

python - 非法指令 : 4 error when running any Tensorflow program

python - Cython 将字符串转换为 unicode

python - 填充图像以在 wxpython 中使用

python - 如何只接受3-8之间的整数而不接受字符串? (Python 2.7.5)

mysql - 有没有办法按照在子句中输入的顺序显示 INNER JOIN 条目?

Php 提高大数据循环的性能

python - Pandas 根据列的值创建新列

php - 在 Laravel 中创建备份 Controller

python - 使用字典列表值选择 pandas 数据框的列

python - Pandas:如何将表示类别的字符串对象列转换为整数?