Source code for hydromt_wflow.components.tables
import glob
import logging
import os
from os.path import basename, join
from typing import TYPE_CHECKING
import pandas as pd
from hydromt.model.components import TablesComponent
from hydromt.model.steps import hydromt_step
if TYPE_CHECKING:
from hydromt.model.model import Model
logger = logging.getLogger(f"hydromt.{__name__}")
[docs]
class WflowTablesComponent(TablesComponent):
"""Wflow specific tables component."""
def __init__(self, model: "Model", filename: str = "{name}.csv"):
super().__init__(model, filename=filename)
[docs]
@hydromt_step
def read(self, filename: str | None = None) -> None:
"""Read tables at provided or default file path if none is provided."""
if filename is None:
filename = self._generate_filename_from_staticmaps()
self.root._assert_read_mode()
self._initialize_tables(skip_read=True)
logger.info("Reading model table files.")
fn = filename or self._filename
filenames = glob.glob(join(self.root.path, fn.format(name="*")))
if len(filenames) > 0:
for fn in filenames:
name = basename(fn).split(".")[0]
if "_hq_" in name:
tbl = self._read_hq_table(fn)
else:
tbl = pd.read_csv(fn)
self.set(tbl, name=name)
[docs]
@hydromt_step
def write(self, filename: str | None = None, **kwargs) -> None:
"""Write tables at provided or default file path if none is provided."""
if filename is None:
filename = self._generate_filename_from_staticmaps()
super().write(filename=filename, **kwargs)
def _generate_filename_from_staticmaps(self) -> str | None:
static_maps_path = self.model.config.get_value("input.path_static")
if static_maps_path is None:
return None
static_maps_folder = os.path.dirname(static_maps_path)
if not static_maps_folder:
static_maps_folder = "."
filename = f"{static_maps_folder}/{{name}}.csv"
return filename
def _read_hq_table(self, filepath: str) -> pd.DataFrame:
"""Read a rating curve table from a CSV file."""
# For HQ table, the first line should be skipped and manually added after
df = pd.read_csv(filepath, skiprows=1, header=None)
df.rename(columns={0: "H"}, inplace=True)
if len(df.columns) != 366:
raise ValueError(
f"HQ table at {filepath} should have 366 columns, 1 for H and 365 for "
f"JDOY Q. Found {len(df.columns)}."
)
return df