gpt4 book ai didi

python - Pandas - write_frame 到 sqlite - datetime64[ns]

转载 作者:行者123 更新时间:2023-11-29 12:12:58 37 4
gpt4 key购买 nike

我正在尝试从 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对象
dtype:对象

我收到一个错误:

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 中执行此操作

如有任何帮助,我们将不胜感激。
干杯!

最佳答案

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

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

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

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

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

然后将你的数据写入sqlite。


旁注:

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

关于python - Pandas - write_frame 到 sqlite - datetime64[ns],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23066261/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com