我有一个具有以下数据类型的pandas数据框
var1 object
var2 datetime64[ns]
var3 object
var4 object
var5 int64
var6 float64
我在sqlite3数据库中的架构是
CREATE TABLE IF NOT EXISTS "table_name" (
"var1" TEXT,
"var2" DATETIME,
"var3" TEXT,
"var4" TEXT,
"var5" INT,
"var6" REAL
);
我在python中的查询看起来很简单
query = 'insert into first_north4 (var1, var2, var3, var4, var5, var6) values (?, ?, ?, ?, ?, ?)'
values = [tuple(x) for x in df.values]
cur.executemany(query, values)
执行查询时,出现此错误消息
sqlite3.InterfaceError: Error binding parameter 1 - probably unsupported type.
这是失败的日期时间,我不知道为什么
答案 0 :(得分:0)
2.2。日期和时间数据类型
SQLite没有预留存储类来存储日期 和/或时间。相反,SQLite内置的日期和时间函数 能够将日期和时间存储为TEXT,REAL或INTEGER 值:
- 文本为ISO8601字符串(“ YYYY-MM-DD HH:MM:SS.SSS”)。
- REAL为朱利安天数,是公元前4714年11月24日格林威治中午以来的天数。根据多方面的
公历。- INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。
应用程序可以选择以以下任何一种方式存储日期和时间 格式,并使用内置日期和格式在格式之间自由转换 时间函数。
一种选择是按照here的描述,在db插入之前将var2转换为字符串(从而在数据库中保留DATETIME数据类型)。还有其他选择,在此论坛上搜索“ datetime64 sqlite”应该提供其他方法。
答案 1 :(得分:0)
我为我找到了一个可行的解决方案(关于日期对象),希望这会在将来对其他人有所帮助。下面的python3中完全可用的示例
import pandas as pd
import datetime as dt
import sqlite3
# est conn (creates db if not exist)
db = 'db_test.db'
conn=sqlite3.connect(db,
detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
cur = conn.cursor()
# create table
query='CREATE TABLE IF NOT EXISTS test(i INT, f REAL, d DATE)'
cur.execute(query)
# some specific datatypes to dataframe
i = [4 ,2 ,44]
f=[1.23,123.2,2.2222]
d = [dt.date.today(),dt.date.today(),dt.date.today()]
df = pd.DataFrame(data=[i,f,d],index = ['i','f','d']).T
print(df)
print(df.dtypes)
print(type(df['i'].values[0]))
print(type(df['f'].values[0]))
print(type(df['d'].values[0]))
# insert
query = 'insert into test (i, f, d) values (? ,?, ?)'
values = [tuple(x) for x in df.values]
print(values)
cur.executemany(query, values)
conn.commit()
# test types when querying the db
query = cur.execute('SELECT * from test')
cols = [column[0] for column in query.description]
data = pd.DataFrame.from_records(data=query.fetchall(), columns=cols)
print(data)
print(data.dtypes)
print(type(data['i'].values[0]))
print(type(data['f'].values[0]))
print(type(data['d'].values[0]))
# close conn
cur.close()
conn.close()