如何在Pandas中按指定datetime时间范围筛选索引数据
错误原因
你的start和end变量都是长度为1的DatetimeIndex类型(不是单个时间戳对象),直接和长度远大于1的df.index做逐元素比较时,Pandas会要求两个比较对象的长度一致,因此抛出长度不匹配的错误。
另外你给出的示例代码里创建DataFrame的逻辑也存在小问题:索引长度为26,但传入的data是长度为25的单行数据,会触发维度不匹配报错,建议先修正为:
import pandas as pd from datetime import timedelta idx = pd.DatetimeIndex(['2021-10-16 15:00:00', '2021-10-16 16:00:00', '2021-10-16 17:00:00', '2021-10-16 18:00:00', '2021-10-16 19:00:00', '2021-10-16 20:00:00', '2021-10-16 21:00:00', '2021-10-16 22:00:00', '2021-10-16 23:00:00', '2021-10-17 00:00:00', '2021-10-17 01:00:00', '2021-10-17 02:00:00', '2021-10-17 03:00:00', '2021-10-17 04:00:00', '2021-10-17 05:00:00', '2021-10-17 06:00:00', '2021-10-17 07:00:00', '2021-10-17 08:00:00', '2021-10-17 09:00:00', '2021-10-17 10:00:00', '2021-10-17 11:00:00', '2021-10-17 12:00:00', '2021-10-17 13:00:00', '2021-10-17 14:00:00', '2021-10-17 15:00:00', '2021-10-17 16:00:00'], dtype='datetime64[ns]', freq='H') # 修正DataFrame创建逻辑 df = pd.DataFrame(range(len(idx)), index=idx, columns=['value']) end = df.tail(1).index start = end - timedelta(hours=5)
解决方法
以下是几种常用的实现方式:
方法1:提取单个时间戳做条件筛选
取DatetimeIndex的第一个元素,得到单个Timestamp对象后再做比较:
start_ts = start[0] end_ts = end[0] result = df.loc[(df.index >= start_ts) & (df.index <= end_ts)]
方法2:使用时间切片(最简洁)
Pandas的Datetime索引原生支持范围切片,直接传入起止时间即可,默认是包含两端的闭区间:
result = df.loc[start[0]:end[0]]
方法3:使用between方法
直接调用索引的between方法判断是否在区间内:
result = df.loc[df.index.between(start[0], end[0])]
内容的提问来源于stack exchange,提问作者Florent
相关产品推荐
相关产品推荐

