You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选Pandas DataFrame中两个时间点之间的行?.loc无返回怎么办?

解决Pandas按时间范围筛选无结果的问题

嘿,我来帮你捋清楚问题出在哪,以及怎么解决!你的代码没返回数据,主要是两个关键环节没做好:

问题根源

  1. 日期列没被解析为datetime类型:Pandas读取CSV时,默认会把像2018-01-01 09:00:00这样的字符串当成普通文本,而不是可识别的时间格式,自然没法按时间筛选。
  2. 没把日期列设为索引:你用loc['时间1':'时间2']的时候,Pandas是在默认的整数行索引(0、1、2...)上找标签,根本不是在时间列上操作,所以肯定找不到匹配的内容。

修正后的代码(最优方案)

先正确读取数据,解析日期并设置为索引,然后用loc切片就没问题了:

import pandas as pd

col_names = ['date','msft','nok','aapl','ibm','amzn']
# 读取时指定解析日期列,并设为索引
stockprices = pd.read_csv(
    './stockdata.csv',
    skiprows=1,
    names=col_names,
    parse_dates=['date'],  # 自动把date列转成datetime类型
    index_col='date'       # 将date列设置为DataFrame的索引
)

# 现在可以直接用时间范围切片
filtered_data = stockprices.loc['2018-01-01 09:00:00':'2018-01-01 11:00:00']
print(filtered_data)

运行这段代码,就能得到你想要的9:00、10:00、11:00这三行数据了。

关于.loc是否是最佳方法?

绝对是!当你的DataFrame用datetime类型做索引时,loc的时间切片语法非常直观,而且效率很高——不仅支持精确的时分秒范围,还能灵活处理更大的时间粒度(比如'2018-01':'2018-02'筛选整个1月到2月的数据)。

如果你不想把日期列设为索引,也可以用布尔索引的方式实现,但可读性和便捷性不如前者:

# 不设索引的替代方案
stockprices = pd.read_csv(
    './stockdata.csv',
    skiprows=1,
    names=col_names,
    parse_dates=['date']
)
filtered_data = stockprices[stockprices['date'].between('2018-01-01 09:00:00', '2018-01-01 11:00:00')]

关键总结

  • 一定要确保日期列是datetime类型,要么读取时用parse_dates,要么事后用pd.to_datetime(stockprices['date'])转换。
  • 用datetime索引配合.loc时间切片,是处理时间范围筛选的最优方案之一。

内容的提问来源于stack exchange,提问作者Ann Kriebel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:20:11