Schreiben von datetime.date mit to_sql throws OperationalError

Ich verwende die neuesten Pandas 14.1 und verwende die Methode to_sql, um auf einen MS SQL server 2008 v2 server zu schreiben. Verwenden von SQLalchemy als Engine. Das folgende Dataframe mit datetime-objecten funktioniert wie erwartet.

#test DataFrame df1 = pd.DataFrame(index=range(10)) df1['A'] = 'Text' df1['date_test'] = datetime.datetime(2014,1,1) 

Code zum Schreiben in die database:

 import sqlalchemy engine = sqlalchemy.create_engine('mssql+pymssql://XXXXXXX') df1.to_sql('test', engine, if_exists='replace') 

Aus geschäftlichen Gründen müssen die data in der database datesobjekte und nicht datetime sein. Wenn ich benutze:

 #test DataFrame df2 = pd.DataFrame(index=range(10)) df2['A'] = 'Text' df2['date_test'] = datetime.date(2014,1,1) # date not datetime 

Die Methode to_sql gibt eine sehr lange Fehlermeldung:

 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....... 

Mein erster Verdacht ist, dass dies ein Fehler mit der neu erstellten functionalität in Pandas 14.1 sein könnte, wenn data in der Methode verwendet werden. Nicht sicher aber

UPDATE: ab pandas 0.15 unterstützt to_sql das Schreiben von Spalten von datetime.date und datetime.time ( https://github.com/pydata/pandas/pull/8090 , jetzt in der Entwicklungsversion).


Unterstützung für datetime.date und datetime.time Typen ist momentan (0.14.1) noch nicht implementiert (nur für den datetime64 Typ und datetime.datetime wird in das umgewandelt), aber es sollte einfach sein, dies hinzuzufügen (da ist ein Problem dafür: https://github.com/pydata/pandas/issues/6932 ).

Das Problem ist, dass im Moment to_sql eine Spalte Texttyp in der database für die Spalte datetime.date (wie es für alle Spalten des object geschieht). Aus diesem Grund bekommst du die obige Fehlermeldung.
Eine mögliche Lösung für jetzt wäre, die database selbst zu erstellen, und dann das Dataframe an sie anhängen.