fix(wavelength_prefix): _viz_infer_wavelength_start_column 加 nm/wavelength/wl/λ 前缀兼容

src/gui/panels/step12_viz_panel.py _viz_infer_wavelength_start_column:

原逻辑只匹配 200.0<=v<=3000.0 的纯数字列名。新增正则剥前缀 _PREFIX_RE =

^(?:nm|wavelength|wl|λ|wave_len)[_\s-]* (不区分大小写),剥后再试 float。

覆盖 nm_700、wavelength_800.0、WL 900、λ_650 等命名风格。

兜底返回 0 时打印 df.columns.tolist() 便于下次失败时一眼定位列名。

Why: 训练光谱 CSV 可能因不同 step 输出格式差异,前缀化列名常见。

viz_thread.py 同步修改(同函数独立副本)。
This commit is contained in:
DXC
2026-06-22 16:37:29 +08:00
parent 561c59fbd4
commit e9c4535bb0

View File

@ -46,16 +46,31 @@ def _viz_training_spectra_csv_path(work_path: Path) -> Path:
def _viz_infer_wavelength_start_column(df: pd.DataFrame) -> Union[str, int]:
"""推断光谱起始列training_spectra 通常以波长数值为列名,未必含 UTM_Y"""
import re
# 兼容前缀nm / nm_ / wavelength / wl / λ / wave_len大小写不敏感
_PREFIX_RE = re.compile(r"^(?:nm|wavelength|wl|\u03bb|wave_len)[_\s\-]*", re.IGNORECASE)
for i, col in enumerate(df.columns):
name = str(col).strip().lstrip("\ufeff")
# 1) 直接纯数字(如 "700.0"
try:
v = float(name)
except ValueError:
v = None
if v is not None and 200.0 <= v <= 3000.0:
return i
# 2) 剥前缀后再试(如 "nm_700"、"wavelength_800.0"、"WL 900"
stripped = _PREFIX_RE.sub("", name)
if stripped != name:
try:
v = float(stripped)
except ValueError:
continue
if 200.0 <= v <= 3000.0:
return i
if "UTM_Y" in df.columns:
return "UTM_Y"
# 兜底分支触发时打印所有列名,便于下次失败时一眼看到根因
print(f"DEBUG: 尝试解析的列名: {df.columns.tolist()}")
return 0