
本文介绍如何修改 python 脚本,在判断电压是否低于阈值(如 0.8 pu)时,自动忽略无意义的 0.0 值,避免误报“失败”,同时提升代码可读性与执行效率。
在电力系统仿真数据分析中,常需扫描日志文件中各时刻的标幺值(PU)电压,并识别是否满足恢复标准(例如:所有关键电压 ≥ 0.8 PU)。但原始数据中常含占位符或未初始化值(如 0.0),它们并非真实低电压,却会触发误判。您当前代码的问题在于:
if float(channel[volts[voltsKeys[k]]]) < acceptableVoltagePU:
isVoltageGood = False该逻辑仅检查是否「小于 0.8」,未排除 0.0 这类无效值。
✅ 正确解法:在条件判断中增加 != 0.0 约束
只需一行修改,即可精准过滤:
current_voltage = float(channel[volts[voltsKeys[k]]])
if current_voltage < acceptable_voltage_PU and current_voltage != 0.0:
is_voltage_good = False? 为什么推荐这种写法? ✅ 一次读取、一次转换:避免重复调用 float(...) 和多层字典索引,提升性能; ✅ 语义清晰:明确表达“有效低电压才视为异常”; ✅ 安全鲁棒:0.0 是精确浮点值,直接比较安全(无需 abs(x)? 额外优化建议(遵循 PEP 8)
Python 社区约定变量名使用 snake_case,增强可维护性:
原变量名 推荐命名 timeForVoltageRecovery time_for_voltage_recovery acceptableVoltagePU acceptable_voltage_PU isVoltageGood is_voltage_good ? 完整修正片段(整合后):
time_for_voltage_recovery = 11.0 acceptable_voltage_PU = 0.8 for channel in data: if float(channel['time']) > time_for_voltage_recovery: is_voltage_good = True keys = sorted(channel.keys()) # 替换 .sort() + .keys(),更 Pythonic volts = {} for key in keys: if key.startswith("VOLT"): try: volts[float(channel[key])] = key.strip() except (ValueError, KeyError): continue # 跳过非法电压值,增强容错 if not volts: outfile.write(f"\nAt time {channel['time']}, no valid VOLT data found.\n") break volts_keys = sorted(volts.keys()) # 取前10个最小有效电压(已自动排除 0.0) for k in range(min(10, len(volts_keys))): v = volts_keys[k] if v < acceptable_voltage_PU and v != 0.0: is_voltage_good = False if is_voltage_good: outfile.write(f"\nAt time {channel['time']}, this scenario passed voltage recovery criteria of {acceptable_voltage_PU} PU!\n") else: outfile.write(f"\n\t***** BAD: At Time {channel['time']}, this scenario failed voltage recovery criteria of {acceptable_voltage_PU} PU :{{ *****\n\n") outfile.write("The lowest 10 non-zero voltages in order are:\n") for k in range(min(10, len(volts_keys))): v = volts_keys[k] if v != 0.0: # 仅输出非零值用于诊断 key_name = volts[v] outfile.write(f"\t{key_name} -> {channel[key_name]}\n") outfile.write("\n") break⚠️ 注意事项:
- 若数据中存在极小正数(如 1e-15)也需排除,建议改用 abs(v) > 1e-10 判断有效性;
- 使用 sorted() 替代 .sort() 更符合函数式风格,且避免原地修改;
- 添加 try/except 可防止因空字段或非数字字符串导致崩溃;
- min(10, len(...)) 防止索引越界,提升健壮性。
通过以上修改,您的脚本将准确识别真实电压异常,彻底规避 0.0 引起的误报警,同时代码更专业、可读、可维护。










