Join the per-zone interim load files into one aligned, validated frame.
Reads each interim/zone_<col>.csv written by download_zone_loads, takes the actual-load column, and outer-joins the zones onto a single complete hourly UTC index (gaps surface as NaN rows). The combined frame is written to interim/<output_file> and returned. The columns are the zone keys, so their sum is the bottom-up total German load.
Fail-safe contract: with on_missing="raise" (the default), any missing hour in any zone raises ValueError (via spotforecast2_safe.preprocessing.checking.check_y) rather than being silently filled. Pass on_missing="passthrough" to return the frame with NaN left in place, so a downstream caller can opt into imputation explicitly (e.g. via the MultiTaskimpute step).