diff --git a/powersimdata/input/converter/pypsa_to_grid.py b/powersimdata/input/converter/pypsa_to_grid.py index ad8423c5c..a9f0eecac 100644 --- a/powersimdata/input/converter/pypsa_to_grid.py +++ b/powersimdata/input/converter/pypsa_to_grid.py @@ -172,7 +172,6 @@ def _read_network(self, n, add_pypsa_cols=True): # Read in data from PyPSA bus_pypsa = n.buses sub_pypsa = pd.DataFrame() - bus2sub_pypsa = pd.DataFrame() gencost_cols = ["start_up_cost", "shut_down_cost", "marginal_cost"] gencost_pypsa = n.generators[gencost_cols] plant_pypsa = n.generators.drop(gencost_cols, axis=1) @@ -207,37 +206,48 @@ def _read_network(self, n, add_pypsa_cols=True): # substations # only relevant if the PyPSA network was originally created from PSD + sub_cols = ["name", "interconnect_sub_id", "lat", "lon", "interconnect"] + sub_pypsa_cols = [ + "y", + "x", + ] if "is_substation" in bus: - sub_cols = ["name", "interconnect_sub_id", "lat", "lon", "interconnect"] sub = bus[bus.is_substation][sub_cols] sub.index = sub[sub.index.str.startswith("sub")].index.str[3:] - sub_pypsa_cols = [ - "name", - "interconnect_sub_id", - "y", - "x", - "interconnect", - ] sub_pypsa = bus_pypsa[bus_pypsa.is_substation][sub_pypsa_cols] - sub_pypsa.index = sub_pypsa[ - sub_pypsa.index.str.startswith("sub") - ].index.str[3:] + sub_pypsa.index = sub.index bus = bus[~bus.is_substation] bus_pypsa = bus_pypsa[~bus_pypsa.is_substation] bus2sub = bus[["substation", "interconnect"]].copy() bus2sub["sub_id"] = pd.to_numeric( - bus2sub.pop("substation").str[3:], errors="ignore" - ) - bus2sub_pypsa = bus_pypsa[["substation", "interconnect"]].copy() - bus2sub_pypsa["sub_id"] = pd.to_numeric( - bus2sub_pypsa.pop("substation").str[3:], errors="ignore" + bus2sub.pop("substation").str[3:], errors="coerce" ) else: - warnings.warn("Substations could not be parsed.") - sub = pd.DataFrame() - bus2sub = pd.DataFrame() + # try to parse typical pypsa-eur(-sec) pattern for substations + sub_pattern = "[A-Z][A-Z]\d+\s\d+$" + + sub = bus[bus.index.str.match(sub_pattern)].reindex(columns=sub_cols) + sub["interconnect"] = np.nan + sub["sub_id"] = sub.index + sub_pypsa = bus_pypsa[bus_pypsa.index.str.match(sub_pattern)][ + sub_pypsa_cols + ] + + sub_pattern = "([A-Z][A-Z]\d+\s\d+).*" + bus2sub = pd.DataFrame( + { + "sub_id": bus.index.str.extract(sub_pattern)[0].values, + "interconnect": np.nan, + }, + index=bus.index, + ) + + if sub.empty and bus2sub.empty: + warnings.warn("Substations could not be parsed.") + sub = pd.DataFrame() + bus2sub = pd.DataFrame() # shunts # append PyPSA's shunts information to PSD's buses data frame on columns @@ -332,7 +342,7 @@ def _read_network(self, n, add_pypsa_cols=True): values = [ (bus, bus_pypsa, grid_const.col_name_bus), (sub, sub_pypsa, grid_const.col_name_sub), - (bus2sub, bus2sub_pypsa, grid_const.col_name_bus2sub), + (bus2sub, None, grid_const.col_name_bus2sub), (plant, plant_pypsa, grid_const.col_name_plant), (gencost, gencost_pypsa, grid_const.col_name_gencost), (branch, branch_pypsa, grid_const.col_name_branch), @@ -367,7 +377,7 @@ def _read_network(self, n, add_pypsa_cols=True): df_psd = df_psd.reindex(const_location, axis="columns") # Add renamed PyPSA columns - if add_pypsa_cols: + if add_pypsa_cols and df_pypsa is not None: df_pypsa = df_pypsa.add_prefix("pypsa_") df_psd = pd.concat([df_psd, df_pypsa], axis=1)