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

多个CSV文件仅首个可导入bt.feeds.PandasData,其余失败求助

问题:仅首个CSV文件可导入Backtrader,其余失败

我已解决此前部分问题,但现在遇到新问题:多个格式近乎一致的CSV文件中,只有第一个能成功导入并读取数据,其余无法完成导入流程。

可复现代码

import datetime
from datetime import timedelta, datetime
import ccxt
import backtrader as bt
import pandas as pd
import os
   
class TestStrategy(bt.Strategy):
    def __init__(self):#计算指标
        self.dataclose=self.datas[0].open
        print(len(self.datas[0]))
    def next(self):#调用指标和策略
        self.log('dataclose,%.2f'%self.dataclose[0])
        print('1')
    def log(self,text):
        dt=self.datas[0].datetime.date(0)
        print('%s %s'%(dt.isoformat(),text))
        print(1)

if __name__=='__main__':
    cerebro = bt.Cerebro()
    since_time = datetime(year=2024, month=12, day=1)
    to_time = datetime(year=2025, month=4, day=1)
    since_time_1 = datetime(year=2024, month=12, day=12, hour=17, minute=30, second=0)

    file_path = "E:/PycharmProjects/PythonProject/backtrader/data/2025-12-12 17:30:00.csv"#可正常导入的文件
    file_path_1 = "E:/PycharmProjects/PythonProject/backtrader/data/2025-01-16 22:00:00.csv" #无法导入的文件
    df = pd.read_csv(file_path, parse_dates=['datetime'])  # 将 datetime 列解析为日期时间类型
    df.index = pd.to_datetime(df.datetime)
    df['openintrest'] = 0
    # 对dataframe的数据列进行一个整合
    df = df[['open', 'high', 'low', 'close', 'volume', 'openintrest']]
    print(df)
    data = bt.feeds.PandasData(
        dataname=df,
        fromdate=since_time,
        todate=since_time_1,
    )

    cerebro.adddata(data)
    cerebro.addstrategy(TestStrategy)
    cerebro.run()

CSV文件内容说明

  • 可正常导入的CSV文件前几行:
    datetime,open,high,low,close,volume
    2024-12-12 17:30:00,xxx,xxx,xxx,xxx,xxx
    ...
    
  • 无法导入的CSV文件前几行:
    datetime,open,high,low,close,volume
    2025-01-16 22:00:00,xxx,xxx,xxx,xxx,xxx
    ...
    

排查与解决办法

  • 调整时间过滤范围
    代码中设置的todate=since_time_1是2024-12-12 17:30:00,而无法导入的CSV文件数据时间在2025年1月,完全不在过滤区间内,导致Backtrader读取不到有效数据,看起来像是导入失败。修改todate为覆盖目标CSV的时间范围,比如:
    updated_todate = datetime(year=2025, month=2, day=1)
    data = bt.feeds.PandasData(
        dataname=df,
        fromdate=since_time,
        todate=updated_todate,
    )
    
  • 检查CSV编码与格式
    部分CSV可能存在编码问题(如UTF-8带BOM)或隐藏空白行,读取时指定编码并验证数据:
    df = pd.read_csv(file_path_1, parse_dates=['datetime'], encoding='utf-8-sig')
    print(df.info()) # 确认数据行数和列格式正常
    
  • 显式指定数据列映射
    为PandasData显式声明各列的位置,避免自动匹配出错:
    data = bt.feeds.PandasData(
        dataname=df,
        fromdate=since_time,
        todate=updated_todate,
        datetime=0,
        open=1,
        high=2,
        low=3,
        close=4,
        volume=5,
        openinterest=-1
    )
    
  • 验证数据加载状态
    添加数据后打印数据长度,确认是否有数据被加载:
    cerebro.adddata(data)
    print(f"加载的数据行数:{len(data)}")
    

内容的提问来源于stack exchange,提问作者dx777

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:55:58