Pandas时间索引切片触发TypeError,求解决方案
问题描述
参考相关回答实现数据切片,编写代码如下:
data_type = params.get_param("DataType") format = '' if data_type == 'Daily': format = "%Y-%m-%d" else: format = "%Y-%m-%d %H:%M:%S" df = pd.read_csv(data_file, parse_dates = True, date_format = format) df.index = pd.DatetimeIndex(df['date2']) # 用作索引的日期列 start_date = '2024-03-01' end_date = '2024-06-01' df = df.index[start_date:end_date]
执行最后一行代码时触发报错:
File "/data/stuart/Projects/Python/BackTesting/MA_Crossover/MA_Crossover3.py", line 520, in <module> main_strategy(df, ticker) File "/data/stuart/Projects/Python/BackTesting/MA_Crossover/MA_Crossover3.py", line 486, in main_strategy plot_chart(ticker, data_output_file, params_file) File "/data/stuart/Projects/Python/BackTesting/BackTestPkg/Charting.py", line 155, in plot_chart df = df.index[start_date:end_date] ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ File "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/pandas/core/indexes/base.py", line 5394, in __getitem__ return self._getitem_slice(key) ^^^^^^^^^^^^^^^^^^^^^^^^ File "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/pandas/core/indexes/base.py", line 5429, in _getitem_slice res = self._data[slobj] ~~~~~~~~~~^^^^^^^ File "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/pandas/core/arrays/datetimelike.py", line 381, in __getitem__ result = cast("Union[Self, DTScalarOrNaT]", super().__getitem__(key)) ^^^^^^^^^^^^^^^^^^^^^^^^ File "/data/stuart/Projects/Python/Env/lib/python3.12/site-packages/pandas/core/arrays/_mixins.py", line 293, in __getitem__ result = self._ndarray[key] ~~~~~~~~~~~~~^^^^^ TypeError: slice indices must be integers or None or have an __index__ method
解决思路
- 错误核心:直接对
df.index用字符串日期切片的方式不被支持,而且你把切片后的索引对象赋值给了df,导致后续操作完全偏离了DataFrame数据切片的需求。 - 修正步骤:
- 使用pandas推荐的
.loc方法对DataFrame进行时间切片,这是时间序列数据筛选的标准方式:df = df.loc[start_date:end_date] - 优化读取CSV的代码,直接指定索引列和解析日期,减少后续操作:
这样读取完成后,df = pd.read_csv(data_file, parse_dates=['date2'], index_col='date2', date_format=format)df的索引就是date2对应的DatetimeIndex,无需手动赋值。 - 确保
start_date和end_date的格式与索引的时间精度匹配,即使是分钟级数据,仅传入日期字符串也能自动匹配当天的起始/结束时间。
- 使用pandas推荐的
内容的提问来源于stack exchange,提问作者StuartM
相关产品推荐
相关产品推荐

