Source code for pyiem.nws.hvtec

"""Process HVTEC encoding."""

import re
from datetime import datetime, timezone

from pyiem.nws.nwsli import NWSLI
from pyiem.util import LOG

#         nwsli        sev         cause
_re = (
    r"(/([A-Z0-9]{5})\.([N0123U])\.([A-Z]{2})\.([0-9TZ]+)\."
    r"([0-9TZ]+)\.([0-9TZ]+)\.([A-Z]{2})/)"
)

HVTEC_RECORD = {
    "OO": "is not applicable",
    "NO": "is not expected",
    "NR": "may be expected",
    "UU": "is not available",
}

HVTEC_CAUSE = {
    "ER": "Excessive Rainfall",
    "SM": "Snowmelt",
    "RS": "Rain and Snowmelt",
    "DM": "Dam or Levee Failure",
    "GO": "Glacier-Dammed Lake Outburst",
    "IJ": "Ice Jam",
    "IC": "Rain and/or Snowmelt and/or Ice Jam",
    "FS": "Upstream Flooding plus Storm Surge",
    "FT": "Upstream Flooding plus Tidal Effects",
    "ET": "Elevated Upstream Flow plus Tidal Effects",
    "WT": "Wind and/or Tidal Effects",
    "DR": "Upstream Dam or Reservoir Release",
    "MC": "Other Multiple Causes",
    "OT": "Other Effects",
    "UU": "Unknown",
}

HVTEC_SEVERITY = {
    "N": "None",
    "0": "None",
    "1": "Minor",
    "2": "Moderate",
    "3": "Major",
    "U": "Unknown",
}


[docs] def parse(text, nwsli_provider=None, tp=None): """Return list of HVTEC entries found within text. Args: text (str): String to look for HVTEC tokens within. nwsli_provider (dict): Provider of metadata. tp (TextProduct): TextProduct instance used for provider and warnings. Returns: list(HVTEC) """ hvtec = [] tokens = re.findall(_re, text) if nwsli_provider is None and tp is not None: nwsli_provider = tp.nwsli_provider if nwsli_provider is None: nwsli_provider = {} for t in tokens: entry = HVTEC(t, nwsli_provider) if ( entry.nwsli.id != "00000" and entry.nwsli.id not in nwsli_provider and tp is not None ): tp.warnings.append(f"HVTEC NWSLI {entry.nwsli.id} is unknown.") hvtec.append(entry) return hvtec
[docs] def contime(s): """Process a string into time.""" if len(re.findall("0000*T", s)) > 0: return None try: ts = datetime.strptime(s, "%y%m%dT%H%MZ") return ts.replace(tzinfo=timezone.utc) except Exception as err: LOG.exception(err) return None
[docs] class HVTEC: """Hydro VTEC.""" def __init__(self, tokens, nwsli_provider=None): """Constructor""" if nwsli_provider is None: nwsli_provider = {} self.line = tokens[0] self.nwsli = nwsli_provider.get(tokens[1], NWSLI(tokens[1])) self.severity = tokens[2] self.cause = tokens[3] self.beginTS = contime(tokens[4]) self.crestTS = contime(tokens[5]) self.endTS = contime(tokens[6]) self.record = tokens[7]
[docs] def __str__(self): """string representation of this HVTEC""" return self.line
[docs] def __repr__(self) -> str: """Return a representation.""" return ( f"cause: {HVTEC_CAUSE[self.cause]}" + f"severity: {HVTEC_SEVERITY[self.severity]}" + f"record: {HVTEC_RECORD[self.record]}" )