【问题标题】:pandas dataframe with Date index -> insert into MySQL带有日期索引的熊猫数据框->插入MySQL
【发布时间】:2015-10-13 12:04:00
【问题描述】:

对象df 的类型是pandas.core.frame.DataFrame。

In [1]: type(df)
Out[1]: pandas.core.frame.DataFrame

df 的索引是一个 DatetimeIndex

In [2]: type(df.index)
Out[2]: pandas.tseries.index.DatetimeIndex

con 提供了一个有效的 MySQLdb 连接

In [3]: type(con)
Out[3]: MySQLdb.connections.Connection

我无法将此数据框正确输入到 MySQL 数据库中,具体来说,日期字段在使用以下内容时显示为空(以及对此的一些变体)。

df.to_sql( name='existing_table',con=con, if_exists='append', index=True, index_label='date', flavor='mysql', dtype={'date': datetime.date})

将这个数据框正确输入到本地 MySQL 数据库中需要哪些步骤,并在数据库中使用“日期”作为日期字段?

【问题讨论】:

  • 这是一个长镜头,这就是为什么我要写评论而不是答案,但如果你使用 dtype={'date': datetime.datetime} 而不是 dtype={'date': datetime.date},它是否有效?如果没有,它只是将null 插入到数据库中还是会引发错误?此外,通过阅读 to_sql 此处的文档:pandas.pydata.org/pandas-docs/stable/generated/…dtype 似乎是可选的,但如果存在,我相信它应该包含所有列。
  • 进行了更改,但它仍然只是输入空值。两种情况都不会报错
  • 纯 MySQLdb 连接不支持写入数据库。您必须将该连接包装在 SQLAlchemy 引擎中(pandas 将其用于数据库风格的特定差异)。对于普通的 DBAPI 连接,仅支持 sqlite。见pandas.pydata.org/pandas-docs/stable/io.html#io-sql
  • 另外,你用的是什么版本的熊猫?
  • 您必须将您的 pandas 版本至少升级到 0.15 才能将日期正确写入 MySQL 数据库。使用这个旧版本,您确实可以使用 MySQLdb 连接,但没有正确处理日期时间类型。较新的 pandas 版本通过使用 SQLAlchemy 改进了支持(请参阅我之前的评论)。

标签: python mysql pandas mysql-python


【解决方案1】:

要将日期时间数据正确写入 SQL,您至少需要 pandas 0.15.0。

从 pandas 0.14 开始,使用 SQLAlchemy 实现 sql 函数来处理数据库风格的特定差异。所以要使用to_sql,你需要提供一个SQLAlchemy engine而不是一个普通的MySQLdb连接:

from sqlalchemy import create_engine
engine = create_engine('mysql+mysqldb://....')

df.to_sql('existing_table', engine, if_exists='append', index=True, index_label='date')

注意:您不再需要提供风味关键字。

不再支持将数据写入 SQL 的普通 DBAPI 连接,除了 sqlite。

更多详情请见http://pandas.pydata.org/pandas-docs/stable/io.html#io-sql

【讨论】:

    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2021-03-19
    • 2017-02-08
    • 2021-05-03
    • 2019-02-11
    • 1970-01-01
    相关资源
    最近更新 更多