python - 将数据帧附加到 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)
现在它显示了正确的日期时间并且选择不是问题。
解决方案
如果您能够使用,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。
推荐阅读
- php - 合并具有相同 ID 的数组
- html - PDF 模板 - HTML 表单 - 自动发送到电子邮件
- java - Java 最短路径问题
- git - 重新定位到远程并且缺少更改;发生了什么?
- python - 在字符串python中的特定关键字之后提取列表
- javascript - 如何将数据从 fetch API 而非 ajax 存储到 var
- android - Xamarin.Forms - WebKit WebView (SKLn-Rad/Xam.Plugin.Webview) 垂直滚动问题
- java - 如何在 Java 中将 UTF-8 转换为字符串
- .htaccess - htaccess:用几个变量重写
- python - Python中的多值变量