Pandas DataFrame多层时间索引使用.loc查询指定时间报错如何解决
问题原因
- 你创建的多层索引顺序为
Date>Time,.loc查询多层索引时默认从第一层级开始匹配,直接传入"11:00:00"会尝试匹配第一级的Date字段,自然无法匹配到结果报错。 - 你拆分出的
Time层级存储的是Python原生datetime.time类型对象,不是字符串,直接传入字符串"11:00:00"哪怕匹配第二层级也存在类型不匹配的问题。
解决方法
方案1:直接按类型匹配第二层级(无需修改原有索引)
使用切片占位第一层级的所有值,传入对应类型的时间对象查询所有日期下对应时间的行:
import datetime # 写法1:用slice占位第一层级 df.loc[(slice(None), datetime.time(11, 0, 0)), :] # 写法2:用IndexSlice简化写法 idx = pd.IndexSlice df.loc[idx[:, datetime.time(11, 0, 0)], :]
如果需要查询指定日期的指定时间,直接传入两级索引值即可:
df.loc[(datetime.date(2021, 9, 1), datetime.time(11, 0, 0)), :]
方案2:将Time层级转为字符串,支持直接传字符串查询
如果需要更方便地用字符串查询,可以在创建多层索引时就把时间转为字符串格式:
# 重构索引,把Time层转为字符串 df.index = pd.MultiIndex.from_arrays( [df.index.date, df.index.strftime("%H:%M:%S")], names=['Date','Time'] ) # 现在可以直接用字符串查询 idx = pd.IndexSlice df.loc[idx[:, "11:00:00"], :]
小提示:多层索引查询前建议先执行
df = df.sort_index()排序,能大幅提升查询效率,也能避免部分版本的pandas出现匹配异常。
内容的提问来源于stack exchange,提问作者Mahome
相关产品推荐
相关产品推荐

