【问题标题】:Pandas - write_frame to sqlite - datetime64[ns]熊猫 - write_frame 到 sqlite - datetime64 [ns]
【发布时间】:2014-04-14 17:18:19
【问题描述】:

我正在尝试从 postgresql 数据库中查询数据并将其插入到 sqlite 数据库中。

这是我的代码:

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 具有数据类型:
field1 对象
field2 datetime64[ns]
field3 float64
field4 对象
数据类型:对象

我收到一个错误:

InterfaceError: Error binding parameter 1 - probably unsupported type.  

开:

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

我猜 sqlite 不喜欢 field2 的 datetime64。我需要帮助弄清楚:
1. 我应该在我的数据框中将 field2 转换为哪种日期类型和
2. 如何在 pandas DataFrame 中做到这一点

任何帮助将不胜感激。
干杯!

【问题讨论】:

    标签: python sqlite postgresql pandas


    【解决方案1】:

    您确实是正确的 datetime64 字段导致了麻烦。 Sqlite 没有真正的日期时间类型,但它们使用文本或整数类型来表示时间(参见http://www.sqlite.org/datatype3.htmlhttp://www.sqlite.org/lang_datefunc.html)。

    所以取决于你想做什么,你可以先将你的日期时间列转换为字符串:

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

    或一个 int(自 1970-01-01 00:00:00 UTC 以来的秒数):

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

    然后将数据写入 sqlite。


    旁注:

    • 您使用的是什么版本的熊猫?因为在 0.13(或更低)版本中,if_exists='replace' 实现中存在一个错误,该错误已在 0.13.1(目前最新的稳定版本)中修复
    • 在即将发布的 pandas 0.14 中,将有一个基于 sqlalchemy 的 sql 函数的新实现,并且会自动转换为字符串(因此 datetime64 数据不再出错)。

    【讨论】:

      猜你喜欢
      • 2016-11-19
      • 2021-02-19
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2021-02-19
      相关资源
      最近更新 更多