Pandas – write_frame to sqlite – datetime64

Estoy intentando consultar datos de una base de datos postgresql e insertarlos en una base de datos sqlite.

Aquí está mi código:

import pandas as pd import pandas.io.sql as pd_sql import sqlite3 as sql3 import psycopg2 #Aquire Data FROM PostgreSQL DB conn_pg = psycopg2.connect("dbname='xx' user='xxxxx' host=xxx.xxx.xx.xxx password='xxxx'"); sql_1='SELECT * FROM table1 limit 5' df_1=pd_sql.read_frame(sql_1,conn_pg) conn_pg.close() #Insert Into sqlite3 DB conn_sqlite=sql3.connect('/xxxx/xxxx/xxxx/xxxx/my_db.db') pd_sql.write_frame(df_1,'table1',conn_sqlite,'sqlite',if_exists='replace') conn_sqlite.close() 

df_1 tiene dtypes:
objeto field1
field2 datetime64 [ns]
field3 float64
objeto field4
dtype: objeto

Estoy recibiendo un error:

 InterfaceError: Error binding parameter 1 - probably unsupported type. 

en:

 pd_sql.write_frame(df_1,'table1',conn_sqlite,'sqlite',if_exists='replace') 

Supongo que a sqlite no le gusta el datetime64 de field2. Necesito ayuda para averiguar:
1. ¿A qué tipo de fecha debo convertir field2 en mi dataframe y
2. ¿Cómo hacer esto en un dataframe de pandas?

Cualquier ayuda sería muy apreciada.
¡Aclamaciones!

De hecho, es correcto que el campo datetime64 esté causando los problemas. Sqlite no tiene un tipo de fecha y hora real, pero utilizan tipos de texto o enteros para representar los tiempos (consulte http://www.sqlite.org/datatype3.html y http://www.sqlite.org/lang_datefunc.html ).

Dependiendo de lo que quieras hacer, primero puedes convertir tu columna datetime en una cadena:

 df['field2'] = df['field2'].apply(str) 

oa un int (el número de segundos desde 1970-01-01 00:00:00 UTC):

 df['field2'] = df['field2'].astype('int64') 

y luego escriba sus datos en sqlite.


Sidenotes:

  • ¿Qué versión de pandas estás usando? Porque en la versión 0.13 (o inferior) hay un error en la if_exists='replace' , que se corrigió en 0.13.1 (la última versión estable en este momento)
  • En los próximos pandas 0.14, habrá una nueva implementación de las funciones de SQL basadas en sqlalchemy, y allí la conversión a una cadena ocurrirá automáticamente (así que no habrá más error para los datos de datetime64).