如何对含DatetimeIndex的时序排序Pandas DataFrame进行切片?
既然你的DataFrame已经按时间顺序排好序了,那针对带DatetimeIndex的DataFrame,有几种非常方便的切片方式,我给你一一说明:
直接用时间字符串做区间切片
因为你的索引是排序后的DatetimeIndex,Pandas支持直接用时间字符串的区间来选取行,语法和普通切片类似,而且是包含两端的。比如你想选取2011年4月1日02:00到03:00之间的所有数据,直接写:df['2011-04-01 02:00':'2011-04-01 03:00']甚至可以简化到日期或小时级别,比如选当天所有数据:
df['2011-04-01'],或者选某个小时段:df['2011-04-01 02':'2011-04-01 03']。用
.loc做精准标签切片
如果需要更明确的标签索引(推荐用这种,可读性更强),可以用.loc搭配时间区间:df.loc['2011-04-01 02:03':'2011-04-01 02:44']这个会精准返回从
2011-04-01 02:03:00到2011-04-01 02:44:00的所有行,刚好对应你示例里的那三行数据。基于时间组件的专用方法
Pandas提供了一些针对时间索引的专用方法,比如between_time可以按一天内的时间段筛选:# 选取每天02:00到02:59之间的数据 df.between_time('02:00', '02:59')还有
at_time可以选取某个具体时间点的数据(如果索引中存在该时间):df.at_time('02:38:00')布尔条件过滤(灵活组合)
如果需要更复杂的筛选逻辑,比如结合时间和数值条件,可以直接用布尔索引:# 筛选时间晚于02:30且数值大于0的行 df[(df.index > '2011-04-01 02:30') & (df[0] > 0)]
最后提醒一下:这些方法之所以好用,前提是你的DatetimeIndex是单调递增排序的,你可以用df.index.is_monotonic_increasing来确认,如果返回True就没问题;如果没排序,记得先执行df = df.sort_index()再做切片哦。
内容的提问来源于stack exchange,提问作者wmatt

