如何将含日期索引的Pandas DataFrame保存到SQLite3并正确读取?
问题
我的数据集首列为Date(作为标识符),执行以下代码保存数据:
print("saving this training set for " + symbol) print(thisDataset) dbHelper.saveTrainingSet(thisDataset, symbol)
dbHelper中的保存方法:
def saveTrainingSet(trainingSet, symbol): conn = sqlite3.connect('my_database') c = conn.cursor() c.execute('CREATE TABLE IF NOT EXISTS trainingsets_' + symbol + ' (' + readColumnsForSaving() +')') conn.commit() trainingSet.to_sql('trainingsets_' + symbol, conn, if_exists='replace', index = False)
但加载数据集时Date列丢失,加载代码如下:
returnedTrainingset = dbHelper.getTrainingSet(symbol) print(returnedTrainingset)
dbHelper中的读取方法:
def getTrainingSet(symbol): conn = sqlite3.connect('technical_analysis_database') c = conn.cursor() c.execute('SELECT * FROM trainingsets_' + symbol) return pd.DataFrame(c.fetchall(), columns=readColumnsForLoading())
尝试将Date列加入列列表时,加载方法抛出列数过多的异常。请问如何正确保存包含Date标识符列的数据集到SQLite3,并成功读取?
解决方案
问题根源梳理
- 数据库连接不一致:保存用的是
my_database,读取用的是technical_analysis_database,导致读取的是错误数据库中的表 - 自定义列名方法
readColumnsForSaving()/readColumnsForLoading()与实际数据集列不匹配,比如保存时没包含Date,加载时强行添加导致列数冲突 - 手动创建表的语句多余,
to_sql会自动根据DataFrame结构生成表结构,手动指定的列可能和实际写入的列不一致
修正后的保存方法
简化逻辑,让pandas自动处理表结构,确保Date列被正常写入:
def saveTrainingSet(trainingSet, symbol): # 统一数据库名称,避免跨库问题 conn = sqlite3.connect('technical_analysis_database') # 无需手动建表,to_sql会自动生成匹配DataFrame的表结构 trainingSet.to_sql(f'trainingsets_{symbol}', conn, if_exists='replace', index=False) conn.close()
修正后的读取方法
用pandas内置的read_sql直接读取,自动识别表的列名和数据,避免手动指定列名的错误:
def getTrainingSet(symbol): conn = sqlite3.connect('technical_analysis_database') # 直接读取整张表,自动匹配列名 df = pd.read_sql(f'SELECT * FROM trainingsets_{symbol}', conn) conn.close() # 可选:将Date列转为日期类型,保证数据格式正确 df['Date'] = pd.to_datetime(df['Date']) return df
额外注意事项
- 如果
Date是数据集的索引列,需要先将其转为普通列再保存:trainingSet = trainingSet.reset_index(),或者将to_sql的index参数设为True - 尽量避免使用自定义列名列表的方法,除非能100%保证其与DataFrame的列完全一致,否则极易出现列数/列名不匹配的问题
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

