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

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数据切片的需求。
  • 修正步骤:
    1. 使用pandas推荐的.loc方法对DataFrame进行时间切片,这是时间序列数据筛选的标准方式:
      df = df.loc[start_date:end_date]
      
    2. 优化读取CSV的代码,直接指定索引列和解析日期,减少后续操作:
      df = pd.read_csv(data_file, parse_dates=['date2'], index_col='date2', date_format=format)
      
      这样读取完成后,df的索引就是date2对应的DatetimeIndex,无需手动赋值。
    3. 确保start_date和end_date的格式与索引的时间精度匹配,即使是分钟级数据,仅传入日期字符串也能自动匹配当天的起始/结束时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:36:14