Pandas时间列区间判断报AttributeError与TypeError问题求解
问题修复方案
错误原因
- 第一个错误
AttributeError: 'Series' object has no attribute 'time':df['time']是pandas的Series对象,不能直接调用仅适用于单个datetime对象的.time()方法,需要先通过.dt访问器调用datetime系列的专属属性。 - 第二个错误
TypeError: 'Series' object is not callable:.dt.time是属性不是方法,不需要加()调用,加括号相当于把返回的时间Series当成函数执行,就会报不可调用错误。 - 额外逻辑运算错误:pandas中对布尔序列做逻辑与运算不能用
and关键字,要用位运算符&,且两个判断条件都要加括号保证运算优先级。
修复后可运行代码
import numpy as np import pandas as pd from datetime import datetime # 生成数据集 df = pd.DataFrame([ { "time": "2021-10-26 9:30", "open": "457.2", "high": "457.29", "low": "456.78", "close": "456.9383", "volume": "594142" }, { "time": "2021-10-26 9:31", "open": "456.94", "high": "457.07", "low": "456.8", "close": "456.995", "volume": "194061" }, { "time": "2021-10-26 9:32", "open": "456.99", "high": "457.22", "low": "456.84", "close": "457.21", "volume": "186114" }, { "time": "2021-10-26 9:33", "open": "457.22", "high": "457.45", "low": "457.2011", "close": "457.308", "volume": "294158" }, { "time": "2021-10-26 9:34", "open": "457.31", "high": "457.4", "low": "457.25", "close": "457.32", "volume": "172574" }, { "time": "2021-10-26 9:35", "open": "457.31", "high": "457.48", "low": "457.18", "close": "457.44", "volume": "396668" }, { "time": "2021-10-26 9:36", "open": "457.48", "high": "457.6511", "low": "457.44", "close": "457.57", "volume": "186777" } ]) start_time = datetime.strptime("09" + "31", "%H%M").time() end_time = datetime.strptime("09" + "33", "%H%M").time() # 转换时间列为datetime类型 df['time'] = pd.to_datetime(df['time']) # 生成布尔列,无需额外用np.where,直接返回布尔序列即可 df['isWithinTimeframe'] = (df['time'].dt.time >= start_time) & (df['time'].dt.time < end_time)
运行结果说明
按给定的9:31到9:33左闭右开时间范围,最终isWithinTimeframe列只有9:31、9:32两行值为True,其余为False,完全匹配需求。
内容的提问来源于stack exchange,提问作者wildcat89
相关产品推荐
相关产品推荐

