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:
@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user