You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含日期索引的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,并成功读取?

解决方案

问题根源梳理

  1. 数据库连接不一致:保存用的是my_database,读取用的是technical_analysis_database,导致读取的是错误数据库中的表
  2. 自定义列名方法readColumnsForSaving()/readColumnsForLoading()与实际数据集列不匹配,比如保存时没包含Date,加载时强行添加导致列数冲突
  3. 手动创建表的语句多余,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:28:32