我有一個 sqlite3 資料庫:
import sqlite3
import pandas as pd
from datetime import datetime
batch_size = 10
con = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
cur = con.cursor()
table = """CREATE TABLE my_table(DateCreated DATETIME);"""
cur.execute(table)
DateCreated = [datetime(2020, 12, 1, 1, 1)] * batch_size
x = list(pd.DataFrame({'DateCreated':DateCreated}).to_records(index=False))
query = """INSERT INTO my_table (DateCreated) values (?);"""
cur.executemany(query, x)
當我想檢索我的日期時間時,sqlite3 回傳一個位元組字串而不是日期時間物件:
cur.execute("SELECT * FROM my_table;")
cur.fetchone()
>> (b'\x00\xf8\xea\x08\xf4qL\x16',)
我究竟做錯了什么?我已經檢查了這個問題,但它并不真正適用于我的問題。我還嘗試將 sqlite 資料型別從 DATETIME 更改為 TIMESTAMP,但收到了ValueError: not enough values to unpack (expected 2, got 1). 我正在使用 Python 3.8.10。
uj5u.com熱心網友回復:
您的代碼段中有兩個不正確之處: sqlite3 列的正確資料型別是timestamp, not datetime。Sqlite3 非常奇特,它只接受任何內容并將所有內容作為字串在內部存盤——它是 Python 驅動程式,它將以不同的方式處理列型別“時間戳”,并能夠直接接受和檢索日期時間物件。
也就是說,“df.to_record”呼叫也無濟于事,因為它將熊貓日期時間作為字串檢索。正確的做法是檢索每個 pandas 單元格值并呼叫.to_pydatetime()它。
因此,如果您需要將示例中未給出的另一個資料幀轉換為 sqlite,則這種代碼可以作業:
import sqlite3
import pandas as pd
from datetime import datetime
batch_size = 10
con = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
cur = con.cursor()
table = """CREATE TABLE my_table(DateCreated timestamp)"""
cur.execute(table)
DateCreated = [datetime(2020, 12, 1, 1, 1)] * batch_size
x = [(rec.to_pydatetime(),) for rec in pd.DataFrame({'DateCreated':DateCreated})["DateCreated"]]
query = """INSERT INTO my_table (DateCreated) values (?)"""
cur.executemany(query, x)
我撰寫x = 上面運算式的方式將允許您從資料框中選擇所需的列,并.to_pydatetime()僅在所需的欄位中呼叫。
如果您的資料框有 5 個其他列,并且日期時間在第 3 位 [索引 2],則此方法有效:
x = [(*rec[0:2], rec[2].to_pydatetime(), *rec[3:]) for _, rec in df.iterrows()]
而且,如果您根本沒有從 pandas 作業流程轉換內容,則無需干預它,只需將 datetime 物件創建為元組并插入它們:
x = [(datetime.now(),) for i in range(10)]
uj5u.com熱心網友回復:
問題在于我使用熊貓的.to_record()方法。如果我取消該步驟并提供元組串列而不是numpy 記錄串列,則資料庫會正確回傳日期時間。
import sqlite3
import pandas as pd
from datetime import datetime
batch_size = 10
con = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
cur = con.cursor()
table = """CREATE TABLE my_table(DateCreated DATETIME);"""
cur.execute(table)
DateCreated = [(datetime(2020, 12, 1, 1, 1),)] * batch_size
query = """INSERT INTO my_table (DateCreated) values (?);"""
cur.executemany(query, DateCreated)
cur.execute("SELECT * FROM my_table;")
cur.fetchall()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476765.html
下一篇:QComboBox.curfrentText()不作業-我總是得到TypeError:execute()argument1mustbestr,nottuple
