带日期索引的Pandas DataFrame按时间段选行触发类型错误的解决求助
问题根源定位
两个报错的核心触发原因:
TypeError: '<' not supported between instances of 'Timestamp' and 'str':你的DataFrame索引自始至终都是字符串类型,没有转为可用于时间比较的DatetimeIndex,所以pandas无法执行Timestamp和字符串的大小排序比较。TypeError: 'DatetimeIndex' object is not callable:一是操作时误把DataFrame的index属性当成方法加了括号调用(df.index是存储索引的属性,不是可执行的方法);二是执行set_index时没有接收方法返回的新DataFrame,导致原数据的索引根本没有完成替换。
正确操作步骤
先将原索引转为标准化时间类型
执行代码把索引字符串转为pandas可识别的时间对象,注意不要给df.index加多余的括号:time_index = pd.to_datetime(df.index)如果存在格式不统一的时间字符串,可以补充参数增强兼容性:
# 无法解析的时间会被转为空值,不会触发报错 time_index = pd.to_datetime(df.index, errors="coerce")正式替换DataFrame的时间索引
set_index方法默认返回设置好索引的新DataFrame,不会修改原对象,必须通过赋值保留替换后的结果,两种写法二选一即可:# 写法1:赋值接收返回值 df = df.set_index(time_index) # 写法2:使用inplace参数原地修改 df.set_index(time_index, inplace=True)很多人执行这步操作无效,就是因为只写了
df.set_index(time_index)没有把返回值赋值给df,原对象没有任何修改。校验索引是否替换成功
执行打印代码确认类型正确:print(type(df.index))正常输出应为
pandas.core.indexes.datetimes.DatetimeIndex,代表索引已经转换完成。
区间筛选操作
索引转换完成后,你之前尝试的几种切片写法都可以正常运行,不需要额外调整:
# 直接用字符串格式的时间区间切片 AntCris = df.loc['2005-01-02':'2007-07-01'] # 传入Timestamp对象做切片 AntCris = df.loc[Timestamp('2005-01-02 00:00:00'):Timestamp('2007-07-01 00:00:00')]
注意:DatetimeIndex类型的索引支持自动类型匹配,即使切片传的是字符串格式的时间,pandas也会自动转换为Timestamp完成比较,不需要手动做类型强转。
内容的提问来源于stack exchange,提问作者Videgain
相关产品推荐
相关产品推荐

