如何对Pandas DataFrame的日期索引进行切片筛选?
Hey,这里有两种简单实用的方法帮你筛选出指定时间范围内的DataFrame行,刚好匹配你想要的结果:
筛选Pandas DataFrame中指定时间范围的行
我注意到你期望的结果包含了time1(2018-01-04)的前一天(2018-01-03),所以下面的方法会按照这个需求实现;如果之后你需要严格的time1到time2区间,我也附上了对应的调整方式。
方法1:使用loc切片(最简洁推荐)
Pandas的日期索引天生支持切片操作,用loc可以直观地选取时间范围,代码非常清爽:
import pandas as pd import numpy as np # 生成原始数据 index = pd.date_range('20180101', periods=10, freq='D') df = pd.DataFrame(np.random.randn(10), index=index) # 给定的时间戳变量 time1 = pd.Timestamp('2018-01-04') time2 = pd.Timestamp('2018-01-08') # 筛选从time1前一天到time2的所有行 filtered_df = df.loc[time1 - pd.Timedelta(days=1): time2] print(filtered_df)
运行后会得到你期望的结果:
0 2018-01-03 -3.054759 2018-01-04 1.473528 2018-01-05 -1.061746 2018-01-06 0.352680 2018-01-07 0.030430 2018-01-08 0.682517
方法2:布尔索引(更灵活)
如果需要叠加其他筛选条件,布尔索引会更灵活,通过生成掩码来筛选行:
# 生成布尔掩码:索引在[time1减1天, time2]区间内 mask = (df.index >= time1 - pd.Timedelta(days=1)) & (df.index <= time2) filtered_df = df[mask] print(filtered_df)
这个方法和切片的结果完全一致,适合复杂条件组合的场景。
若需严格筛选time1到time2闭区间
只需要调整起始条件为time1即可:
# 使用loc切片的方式 filtered_df = df.loc[time1: time2] # 使用布尔索引的方式 mask = (df.index >= time1) & (df.index <= time2) filtered_df = df[mask]
对应的结果为:
0 2018-01-04 1.473528 2018-01-05 -1.061746 2018-01-06 0.352680 2018-01-07 0.030430 2018-01-08 0.682517
内容的提问来源于stack exchange,提问作者math
相关产品推荐
相关产品推荐

