Pandas 1.5.3中Index.get_indexer无法替代index.get_loc的问题
问题:Pandas 1.5.3中用get_indexer替代get_loc报错的原因及解决方法
此前使用Pandas 1.4之前的版本,升级至1.5.3后收到大量index.get_loc的弃用提示,改用index.get_indexer却报错:'datetime.datetime' object is not iterable。
代码以时间戳为索引,使用get_loc时传入单个datetime对象即可获取索引位置,但get_indexer执行失败。示例代码如下:
from datetime import datetime, timedelta import pandas as pd import numpy as np expiration_date = datetime(2016,3,24,16,00,0) num_minutes = 50000 date_list = [expiration_date - timedelta(minutes=x) for x in range(num_minutes)] df = pd.DataFrame(index = date_list) searchDate = date_list[10] idx_get_loc = df.index.get_loc(searchDate, method='nearest') print(f'Closes index using get_loc: {idx_get_loc}') idx_get_indexer = df.index.get_indexer(searchDate, method='nearest') print(f'Closes index using get_indexer: {idx_get_indexer}')
解决方法
核心问题是**get_indexer和get_loc的参数要求不同**:
get_loc接收单个标签(比如单个datetime对象),返回该标签对应的单个索引位置;get_indexer要求传入可迭代的标签序列(比如列表、数组),返回对应每个标签的索引位置数组。
你直接传入单个datetime对象,它不属于可迭代类型,因此触发了报错。
修改代码只需把单个searchDate包装进列表即可:
# 将单个datetime对象放入列表中传入 idx_get_indexer = df.index.get_indexer([searchDate], method='nearest') print(f'Closest index using get_indexer: {idx_get_indexer[0]}')
执行后会返回一个数组,取数组第一个元素就能得到和get_loc一致的单个索引位置。
如果需要批量查询多个日期,直接把所有待查日期放进列表传入get_indexer即可,它会返回每个日期对应的索引位置数组——这也是get_indexer相比get_loc的核心优势:支持批量标签查询。
内容的提问来源于stack exchange,提问作者Craig Evans
相关产品推荐
相关产品推荐

