多个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
相关产品推荐
相关产品推荐

