Pandas中如何对元组索引(名称、日期)按日期范围排序及查询索引区间?
关于Pandas复合索引的范围查询与排序解决方案
首先还原你的问题场景:
我有如下Pandas表格:
f.tail() Close High Low Open Volume Symbol Date F 2017-05-18 10.79 10.820 10.70 10.73 37890246 2017-05-19 10.87 10.940 10.79 10.81 32429488 2017-05-22 11.10 11.130 10.98 11.11 73301992
我可以通过以下方式进行索引:
f.ix[('F', date(2017,5,18))]
但我不清楚如何对这类元组索引查询索引范围,同时想了解如何按日期范围对其排序?
你的数据是典型的**MultiIndex(复合索引)**结构,包含Symbol和Date两个层级,下面分别解决你的两个问题:
一、复合索引的范围查询
先提个实用小建议:新版本Pandas已经弃用ix方法了,推荐用loc(标签索引)或者iloc(位置索引)操作,避免兼容性问题。针对复合索引的范围查询,有两种常用方法:
1. 用loc做精准切片
如果要查询特定Symbol下的日期范围,直接用元组+slice函数就能实现:
from datetime import date # 查询Symbol=F,日期在2017-05-18到2017-05-22之间的所有数据 f.loc[('F', slice(date(2017,5,18), date(2017,5,22))), :]
要是你需要同时对Symbol和Date都做范围筛选(比如多个Symbol+日期区间),可以这样组合切片:
# 示例:查询Symbol从'A'到'F',日期在指定区间内的数据 f.loc[(slice('A', 'F'), slice(date(2017,5,18), date(2017,5,22))), :]
2. 用xs方法快速定位层级
如果你只关注某个Symbol下的日期范围,xs(Cross Section)方法会更简洁:
# 先提取Symbol=F的所有数据,再筛选日期范围 f.xs('F', level='Symbol').loc[date(2017,5,18):date(2017,5,22)]
二、按日期范围排序
你的数据看起来已经是按日期升序排列的,但如果需要重新排序或者针对特定日期范围排序,可以参考下面的方法:
1. 按Date索引层级全局排序
如果要对整个DataFrame按日期排序(不管Symbol),直接用sort_index指定层级即可:
# 按Date升序排序(默认就是升序,ascending=True可以省略) f.sort_index(level='Date') # 要是需要降序排序,加上ascending=False f.sort_index(level='Date', ascending=False)
2. 先筛选日期范围再排序
如果只需要对某个日期区间内的数据排序,先筛选再排序就好:
# 第一步:筛选F在指定日期范围内的数据 filtered_data = f.loc[('F', slice(date(2017,5,18), date(2017,5,22))), :] # 第二步:按Date降序排序 sorted_data = filtered_data.sort_index(level='Date', ascending=False)
额外注意点
- 确保你的
Date索引是datetime类型,如果不是的话,先转换一下,否则切片可能失效:
f.index = f.index.set_levels(pd.to_datetime(f.index.get_level_values('Date')), level='Date')
- 记住不要再用
ix啦,新版本Pandas已经移除了这个方法,用loc和iloc更规范。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

