小编典典

熊猫to_sql方法给出日期列错误

sql

我有一个看起来像这样的数据框:

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

也有一个带名为fee_profit的表的sqlite3 db

fee_profit有4个栏位:

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

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

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模型创建的


阅读 232

收藏
2021-04-14

共1个答案

小编典典

更新: 从pandas
0.15开始,to_sql支持将两个sqlite连接的日期时间值编写为sqlalchemy引擎。因此,不再需要下面描述的解决方法。
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来处理不同的数据库风格。如果使用此方法,它将与datetime列一起正常工作(它将自动将其转换为字符串):

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!)。

2021-04-14