
本文介绍如何修改 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) < 1e-9)。
? 额外优化建议(遵循 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 引起的误报警,同时代码更专业、可读、可维护。










