我正在使用最新的pandas 14.1并使用to_sql方法写入MS SQL Server 2008 v2服务器。使用SQLalchemy作为引擎。以下具有datetime对象的数据框按预期工作。
#test DataFrame
df1 = pd.DataFrame(index=range(10))
df1['A'] = 'Text'
df1['date_test'] = datetime.datetime(2014,1,1)
用于写入数据库的代码:
import sqlalchemy
engine = sqlalchemy.create_engine('mssql+pymssql://XXXXXXX')
df1.to_sql('test', engine, if_exists='replace')
出于商业原因,数据库中的数据需要是日期对象而不是日期时间。如果我使用:
#test DataFrame
df2 = pd.DataFrame(index=range(10))
df2['A'] = 'Text'
df2['date_test'] = datetime.date(2014,1,1) # date not datetime
to_sql方法给出了一条非常长的错误消息:
OperationalError: (OperationalError) (206, 'Operand type clash: datetime is incompatible
with textDB-Lib error message 206, severity 16:\nGeneral SQL Server error:
Check messages from the SQL Server.......
我首先怀疑,如果在方法中使用日期,这可能是Pandas 14.1中新创建的功能的错误。但不确定。
答案 0 :(得分:1)
更新:从pandas 0.15开始,to_sql
支持编写datetime.date
和datetime.time
(https://github.com/pydata/pandas/pull/8090的列,现在处于开发版本。)
目前支持datetime.date
和datetime.time
类型(0.14.1)尚未实施(仅适用于datetime64
类型,datetime.datetime
将转换为但是,添加它应该很容易(它有一个问题:https://github.com/pydata/pandas/issues/6932)。
问题在于,to_sql
目前在datetime.date
列的数据库中创建了一列文本类型(就像object
dtype的所有列一样)。因此,您收到上述错误消息
现在可能的解决方案是自己创建数据库,然后将数据框附加到它。