Update:从 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!)。