如何基于时间过滤Pandas DataFrame?转换报错求助
问题分析与解决方案
核心问题
你的time列虽然显示为HH:MM:SS格式,但实际存储的是**datetime.time类型对象**,而非字符串。这直接导致两个问题:
- 使用
pd.to_datetime转换时,该函数无法直接将datetime.time对象转为datetime类型,触发TypeError - 直接字符串搜索无效,因为列中存储的不是字符串,无法匹配字符串条件
验证方法
执行以下代码可确认time列的实际类型:
print(events_df['time'].apply(type).unique())
输出会显示类似[<class 'datetime.time'>],验证上述结论。
解决方案
方案1:直接匹配datetime.time对象
将split_time转换为datetime.time类型,直接和列中的对象匹配:
from datetime import datetime start_time = "25 September 2022, 13:00:00" split_time = start_time.split(", ")[1] # 把字符串时间转为datetime.time对象 target_time = datetime.strptime(split_time, "%H:%M:%S").time() # 直接过滤time列 filtered_df = events_df.loc[events_df['time'] == target_time]
方案2:将time列转为字符串后匹配
如果更习惯字符串操作,先把time列转为字符串再过滤:
start_time = "25 September 2022, 13:00:00" split_time = start_time.split(", ")[1] # 将time列转为字符串格式 events_df['time_str'] = events_df['time'].astype(str) # 按字符串匹配过滤 filtered_df = events_df.loc[events_df['time_str'] == split_time]
方案3:合并日期时间列(更推荐)
把start_date和time合并为完整的datetime列,后续可直接按完整时间过滤,避免日期和时间分开处理的麻烦:
from datetime import datetime start_time = "25 September 2022, 13:00:00" # 把目标时间转为datetime类型 target_datetime = datetime.strptime(start_time, "%d %B %Y, %H:%M:%S") # 合并DataFrame中的日期和时间为完整datetime列 events_df['full_datetime'] = pd.to_datetime( events_df['start_date'].astype(str) + ' ' + events_df['time'].astype(str) ) # 按完整datetime过滤 filtered_df = events_df.loc[events_df['full_datetime'] == target_datetime]
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

