当前位置: 首页 > 面试题库 >

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

薄龙光
2023-03-14
问题内容

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

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


问题答案:

更新: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!)。



 类似资料:
  • 问题内容: 我用来将数据框导出到mysql中。但是,我发现具有长字符串内容(例如url)的列被截断为63位数字。导出时,我从ipython笔记本收到以下警告: /usr/local/lib/python2.7/site- packages/pandas/io/sql.py:248:警告:第3行cur.executemany(insert_query,data)的列’url’的数据被截断了 对于不同

  • 问题内容: 如何计算人的年龄(基于dob列),并使用新值将一列添加到数据框中? 数据框如下所示: 我尝试执行以下操作: 但是,收到以下错误: TypeError:-:“ datetime.datetime”和“ str”的不受支持的操作数类型 问题答案: 产量 看来您的栏目前是字串。首先,将它们转换为using 。 该格式将最后两位数字转换为年份,但不幸的是假设的平均值为2052。由于这可能不是希

  • 问题内容: 我创建了一些小的方法作为Util类,例如以下代码: 并且,进行了非常简单的运行,如下所示: 结果是一个很奇怪的日期-> 2017/07/187 搜索了类似的问题,并尝试了TimeZone,Locale,但没有帮助。有什么建议 ? 顺便说一句,这是我的环境: Windows7 x86 JDK 1.8.0.131 x86 Oxygen corrosion of x86 问题答案: 您格式化

  • 问题内容: 我有一个固定宽度的数据文件,其中包含日期,但是当我尝试绘制数据时,日期无法在x轴上正确显示。 我的档案看起来像 等等 我用 熊猫 读文件 所以我想这里的问题是从熊猫到matplotlib日期时间的转换,如何进行转换? 我也直接尝试了熊猫: 但这失败了 TypeError:空的“ Series”:没有要绘制的数字数据 问题答案: 如果您使用包含列名而不是字符串的列表,则data.set_

  • 问题内容: 我有一个简单的方法,应该获取当前日期,将其放入某种格式,然后将其作为String返回。到目前为止,一切都很好(上次尝试于1月31日进行),但由于某种原因,当我今天尝试使用它时,它返回字符串“2013-02-43”。 显然,二月份没有43天,而且我不知道为什么要返回此日期。我到处都在寻找解决方案,但似乎没有一个适合我遇到的特定问题。这是代码: 仅出于记录目的,我尝试使用Calendar.