python - pandas to_sql 方法给出日期列错误

标签 python sql sqlite pandas

我有一个如下所示的数据框:

df = pd.DataFrame(index= pd.date_range('2014-01-01', periods=10))
df['date'] = df.index.map(lambda x: x.strftime('%d-%m-%Y'))
df['date'] = df.index
df['profit']= rand(10)
df['perf_period_id']=2

还有一个 sqlite3 数据库,其中有一个名为 Fee_profit 的表

fee_profit 有 4 个字段:

  • id - 整数 - 主键
  • perf_period_id - 整数
  • 日期 - 日期
  • 实际利润

当我尝试将数据帧写入数据库时​​(不显示数据库连接):

df.to_sql(name='fee_profit', index=False, con=db, if_exists='append')

我得到以下代码:

252     else:
253         data = [tuple(x) for x in frame.values.tolist()]
--> 254     cur.executemany(insert_query, data)
255 
256 
InterfaceError: Error binding parameter 0 - probably unsupported type.

没有传递主键(这可能是问题所在吗?)我把表格弄乱了,看起来肯定是日期出了问题。尝试了在索引中传递日期的各种组合,也是字符串,但没有任何效果。

知道我哪里出错了。在任何地方都找不到使用此方法的示例。

使用 Pandas 0.13.1 和 sqlite 3 2.6.0。数据库是通过django 1.6模型创建的

最佳答案

更新:从 pandas 0.15 开始,to_sql支持作为 sqlalchemy 引擎为两个 sqlite 连接写入日期时间值。因此不再需要下面描述的解决方法。
Pandas 0.15将于10月份发布,该功能已合并到开发版本中。


出现上述错误的原因是df “日期”列是 datetime64列,而sqlite3不支持该类型。因此,您应该首先将其转换为字符串(这对于 sqlite 来说不会自动完成,这可能是一个错误/缺少功能),或者转换为 datetime.date对象(由sqlite3识别,但它也会被转换为字符串,因为sqlite没有日期时间类型)。

您在代码示例中使用 df['date'] = df.index.map(lambda x: x.strftime('%d-%m-%Y')) 做到了这一点,但随后您再次使用 df['date'] = df.index 覆盖该列,所以这可能是您的代码示例中的错误。但如果您首先将其转换为字符串,它就会起作用:

df = pd.DataFrame(index= pd.date_range('2014-01-01', periods=10))
df['date'] = df.index.map(lambda x: x.strftime('%d-%m-%Y'))
df['profit']= rand(10)
df['perf_period_id']=2

df.to_sql(name='fee_profit', index=False, con=db, if_exists='append')

从pandas 0.14开始,主要的sql函数被重构为使用sqlalchemy来处理不同的数据库风格。如果您使用它,它将与日期时间列一起正常工作(它会自动将其转换为字符串):

df = pd.DataFrame(index= pd.date_range('2014-01-01', periods=10))
df['profit']= rand(10)
df['perf_period_id']=2

import sqlalchemy
db2 = sqlalchemy.create_engine('...')
df.to_sql(name='fee_profit', index=False, con=db2, if_exists='append')

像您一样,使用普通的 sqlite 连接对象而不是 sqlalchemy 引擎,将来仍将受到支持(但仅限于 sqlite!)。

关于python - pandas to_sql 方法给出日期列错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24389580/

相关文章:

python - sqlite3.操作错误: duplicate column name: MOLECULE

java - 如何将现有 SQLite 数据库连接到 ExpandableListView?

python - 安装 Shapely 时出现 "python setup.py egg_info"失败,错误代码为 1

python json模块导入错误

python - Pandas 将字典嵌套到数据框

SQL Server - 动态列的 WHERE 子句

用于对数据进行分组的 SQL 查询

php - $ sql变量声明错误

Python Pandas : classifying values in column and making a new column

java - Android:如何从 Sqlite 中求和实际值?