Pandas筛选22:00-23:00数据时触发SyntaxError语法错误求助
问题分析与修正
核心错误点
时间解析格式不匹配
你的CSV中complaint_time是12:22:01 AM这种12小时制带AM/PM的格式,但你用了%H:%M.%S(24小时制、点分隔秒)来解析,完全不匹配,会导致时间转换失败,后续筛选自然出错。正确格式应该是%I:%M:%S %p:%I:12小时制的小时(01-12)%p:AM/PM标识- 注意原数据秒部分是冒号分隔,不是点,所以格式字符串里要用冒号连接时分秒。
筛选条件语法完全错误
23:00.0.to_datetime()是无效的Python语法,你需要将目标时间转换为可比较的datetime/time对象,同时逻辑条件的写法也不符合规则:- 不能连续写
<= x & >= y,必须拆分为两个独立条件并分别加括号(因为&优先级高于比较运算符) - 需要用
pd.Timestamp或datetime构造目标时间,再提取时间部分和complaint_time的时间部分比较。
- 不能连续写
可选优化点
- 直接操作全局字典
Dict2不是好的编程习惯,建议在函数内返回结果再赋值 late.count()[0]可以用len(late)或late.shape[0]替代,更直观易懂
- 直接操作全局字典
修正后的完整代码
import pandas as pd from datetime import datetime # 读取数据并修正时间解析格式 df = pd.read_csv("nyc_noise_complaints.csv") df['complaint_time'] = pd.to_datetime(df['complaint_time'], format="%I:%M:%S %p") # 初始化统计字典 borough_complaints = {} # 定义统计函数 def count_late_complaints(borough): # 筛选22:00-23:00(含22:00,不含23:00)的投诉 filtered = df.loc[ (df['borough'] == borough) & (df['complaint_time'].dt.hour >= 22) & (df['complaint_time'].dt.hour < 23) ] return len(filtered) # 遍历所有区统计 for borough in ['BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND']: borough_complaints[borough] = count_late_complaints(borough) # 找出投诉最少的区 smallest_borough = min(borough_complaints, key=borough_complaints.get) print(f"22:00-23:00投诉量最少的区:{smallest_borough},数量:{borough_complaints[smallest_borough]}")
额外说明
- 如果需要精确到秒的区间(比如22:00:00到23:00:00),可以用时间对象比较:
start = pd.Timestamp('22:00:00').time() end = pd.Timestamp('23:00:00').time() filtered = df.loc[ (df['borough'] == borough) & (df['complaint_time'].dt.time >= start) & (df['complaint_time'].dt.time <= end) ] - 用
dt.hour筛选更简洁,适合只关注小时区间的场景
内容的提问来源于stack exchange,提问作者Newbie1
相关产品推荐
相关产品推荐

