如何筛选Pandas DataFrame中两个时间点之间的行?.loc无返回怎么办?
解决Pandas按时间范围筛选无结果的问题
嘿,我来帮你捋清楚问题出在哪,以及怎么解决!你的代码没返回数据,主要是两个关键环节没做好:
问题根源
- 日期列没被解析为datetime类型:Pandas读取CSV时,默认会把像
2018-01-01 09:00:00这样的字符串当成普通文本,而不是可识别的时间格式,自然没法按时间筛选。 - 没把日期列设为索引:你用
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
相关产品推荐
相关产品推荐

