Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将dataframe追加到sqlite3表,BLOB代替时间戳_Python_Pandas_Sqlite - Fatal编程技术网

Python 将dataframe追加到sqlite3表,BLOB代替时间戳

Python 将dataframe追加到sqlite3表,BLOB代替时间戳,python,pandas,sqlite,Python,Pandas,Sqlite,我试图将pandas数据框中的数据附加到SQLite db中的现有表中。在这个过程之后,当我尝试使用浏览器查看数据时,它显示为BLOB。当我试图从数据库中读取数据时,我得到错误: sql“按时间戳DESC limit 80000从bnffut顺序选择*失败”:没有足够的值来解包(预期为2,得到1) 将数据帧读入SQLite表: # the dtype of timestamp column is datetime64[ns] query = 'insert or replace into bnf

我试图将pandas数据框中的数据附加到SQLite db中的现有表中。在这个过程之后,当我尝试使用浏览器查看数据时,它显示为
BLOB
。当我试图从数据库中读取数据时,我得到错误:

sql“按时间戳DESC limit 80000从bnffut顺序选择*失败”:没有足够的值来解包(预期为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列太长,我将timestamp列更改为:

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'>}
打印(数据类型)
{'col_str':,
“国际上校”:,
“col_date”:
在此处阅读有关SQL Alchemy和SQL lite的更多信息:


我个人只使用过postgres和sql server,但从文档来看,它看起来很相似

您使用什么来写入数据?sql炼金术还是其他什么?@datanovel
sqlite3
pandas
。我不确定你是不是在问这个?你在用什么ORM?我问这个问题的原因是因为你可以事先声明你的
meta_类型
,但这取决于你的连接层,使用
sql alchemy
我通常会记录我的列并在那里声明每种类型(int、varchar等)@datanovel我该如何检查?除了sqlite3和Pandash之外,我没有导入任何其他有用的东西,我知道它与您使用的语法不兼容,但我认为sqlalchemy API非常优秀,应该在这个例子中有所帮助。谢谢,我找到了上面编辑的解决方案。但是仍然想知道是否有更好的方法来解决这个问题。你应该把它作为一个答案添加进去,但它感觉像一个黑客方法,sqllite本身的列类型是什么?如果它是一个字符串,那么如果不先转换数据,就无法执行日期时间操作(sql)。这肯定是有问题的,我正在等待有人给出更好的答案。令人惊讶的是,datetime操作似乎有效。