首页 > 解决方案 > 将数据帧附加到 sqlite3 表,BLOB 而不是时间戳

问题描述

我正在尝试将 pandas 数据框中的数据附加到 SQLite 数据库中的现有表中。在我尝试使用资源管理器查看数据的过程之后,它显示为BLOB. 当我尝试从数据库读取到 pandas 时,出现错误:

sql 'select * from bnffut order by timestamp DESC limit 80000' 执行失败:没有足够的值来解包(预期 2,得到 1)

将数据框读入 SQLite 表:

# the dtype of timestamp column is datetime64[ns]
query = 'insert or replace into bnffut (timestamp,close,bid,ask) values (?,?,?,?)'
conn.executemany(query, df.to_records(index=False))
conn.commit()

然后我尝试将其读入数据框:

select_statement = 'select * from '+ 'bnf' +'fut order by timestamp DESC limit 80000'
m1df = pd.read_sql(select_statement, conn)

1 - 如何将数据添加到 sqlite 表以确保它不是BLOB时间戳本身?

编辑

我已经找到了解决我的特定问题的方法。

对于 sqlite3 列,dtype 太长,我将时间戳列更改为:

df['timestamp'] = df['timestamp'].astype(str)

现在它显示了正确的日期时间并且选择不是问题。

标签: pythonpandassqlite

解决方案


如果您能够使用,sqlalchemy那么您将能够利用该.types课程

例如 :

from sqlalchemy.types import INTEGER, NVARCHAR, DATETIME
# on the assumption you have 3 columns, col_str, col_int, col_date
data_types_dict = {'col_str' : NVARCHAR,
                   'col_int' : INTEGER,
                   'col_date' : DATETIME}
# assuming you have your connection defined as engine
df.to_sql(con=engine,dtypes=data_types_dict,index=False,schema='dim',if_exists='append')

当你打印你的字典时

print(data_types_dict)
{'col_str': <class 'sqlalchemy.sql.sqltypes.NVARCHAR'>, 
'col_int': <class 'sqlalchemy.sql.sqltypes.INTEGER'>, 
'col_date': <class 'sqlalchemy.sql.sqltypes.DATETIME'>}

在此处阅读有关 SQL Alchemy 和 SQL lite 的更多信息:https ://docs.sqlalchemy.org/en/13/dialects/sqlite.html

我个人只使用过 postgres 和 sql-server,但从文档来看,它看起来是 v.similair。


推荐阅读