From 4df0be85517c3266c27ef574408d5b60f05d53c2 Mon Sep 17 00:00:00 2001 From: msweier Date: Fri, 25 Oct 2024 15:00:13 -0500 Subject: [PATCH] update missing values --- src/getECCC/getECCC.ipynb | 2 +- src/getNwsAcis/getAcisData.ipynb | 274 +++---- src/getNwsAcis/getNwsAcis.py | 7 +- src/getNwsAcis/getNwsIem.py | 179 +++++ src/loadNwsCHPS/loadNwsCHPS.ipynb | 1149 +++++++++++++++++++++++++++++ src/loadNwsCHPS/loadNwsCHPS.py | 262 +++++++ 6 files changed, 1709 insertions(+), 164 deletions(-) create mode 100644 src/getNwsAcis/getNwsIem.py create mode 100644 src/loadNwsCHPS/loadNwsCHPS.ipynb create mode 100644 src/loadNwsCHPS/loadNwsCHPS.py diff --git a/src/getECCC/getECCC.ipynb b/src/getECCC/getECCC.ipynb index f263a11..58d10d2 100644 --- a/src/getECCC/getECCC.ipynb +++ b/src/getECCC/getECCC.ipynb @@ -2596,7 +2596,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "env-cwms", "language": "python", "name": "python3" }, diff --git a/src/getNwsAcis/getAcisData.ipynb b/src/getNwsAcis/getAcisData.ipynb index 1bdfb4a..3a20b80 100644 --- a/src/getNwsAcis/getAcisData.ipynb +++ b/src/getNwsAcis/getAcisData.ipynb @@ -2,28 +2,30 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "def write_big_ts(dataObject, maxRecords=20000):\n", - " df, name, units = dataObjectToDf(dataObject)\n", - " #print(df, name, units)\n", - " \n", - " total_rows = len(df)\n", - "\n", - " for start_idx in range(0, total_rows, maxRecords):\n", - " end_idx = min(start_idx + maxRecords, total_rows)\n", - " print(f\"Storing rows {start_idx} to {end_idx}\")\n", - " data_json = cwms.timeseries_df_to_json(data = df.loc[start_idx:end_idx-1], \n", - " ts_id = name, units = units, office_id = OFFICE)\n", - " #print(data_json)\n", - " cwms.store_timeseries(data=data_json)" + "#!/bin/env python3\n", + "# this script will download precip and temp data from NWS ACIS\n", + "import logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "from datetime import datetime, timedelta\n", + "import cwms\n", + "from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter\n", + "# load .env python environment for storing API_KEY\n", + "# .env file can be stored a parent directory of script\n", + "# https://dev.to/jakewitcher/using-env-files-for-environment-variables-in-python-applications-55a1\n", + "from dotenv import load_dotenv\n", + "import os\n", + "import requests\n", + "import json" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -47,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -63,12 +65,12 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# days back to get data\n", - "lookbackDays = 1\n", + "lookbackDays = 10\n", "# hrs offset to store values...default 12z\n", "hourOffset = 12\n", "#acis url\n", @@ -107,11 +109,13 @@ " \"mint\":\"F\", \n", " \"obst\":\"F\",\n", " 13:\"in\",\n", - " 28:\"mph\",\n", - " 27:\"deg\" \n", + " #28:\"mph\",\n", + " #27:\"deg\" \n", " }\n", "#missing value in CWMS\n", - "missingValueCwms = -340282346638528859811704183484516925440\n", + "cwms_missing_value = -340282346638528859811704183484516925440\n", + "cwms_missing_quality = 5\n", + "\n", "# create list of column names\n", "cols = [d[list(d.keys())[0]] for d in elems]\n", "# add date-time as column\n", @@ -133,14 +137,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2024-07-21 2024-07-22\n" + "2024-10-15 2024-10-25\n" ] } ], @@ -153,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -165,7 +169,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -190,9 +194,10 @@ " \n", " \n", " office-id_x\n", + " attribute_x\n", " office-id_y\n", " alias-id\n", - " attribute\n", + " attribute_y\n", " \n", " \n", " location-id\n", @@ -200,26 +205,22 @@ " \n", " \n", " \n", + " \n", " \n", " \n", " \n", " \n", - " TraverseRES_Dam\n", - " MVP\n", + " TraverseWR_Dam\n", " MVP\n", - " TRAM5\n", " 0.0\n", - " \n", - " \n", - " Baldhill_Dam\n", - " MVP\n", " MVP\n", - " BLDN8\n", + " WHRM5\n", " 0.0\n", " \n", " \n", " EauGalle_Dam\n", " MVP\n", + " NaN\n", " MVP\n", " SVPW3\n", " 0.0\n", @@ -227,6 +228,7 @@ " \n", " MissHW_Winni\n", " MVP\n", + " NaN\n", " MVP\n", " WNBM5\n", " 0.0\n", @@ -234,6 +236,7 @@ " \n", " MissHW_PineRiver\n", " MVP\n", + " NaN\n", " MVP\n", " CRLM5\n", " 0.0\n", @@ -241,6 +244,7 @@ " \n", " LacQuiParle_Dam\n", " MVP\n", + " NaN\n", " MVP\n", " LAQM5\n", " 0.0\n", @@ -248,6 +252,7 @@ " \n", " MissHW_Gull\n", " MVP\n", + " NaN\n", " MVP\n", " GLLM5\n", " 0.0\n", @@ -255,6 +260,7 @@ " \n", " LowerSAFalls\n", " MVP\n", + " NaN\n", " MVP\n", " LSAM5\n", " 0.0\n", @@ -262,6 +268,7 @@ " \n", " RedLake_Dam\n", " MVP\n", + " NaN\n", " MVP\n", " RRDM5\n", " 0.0\n", @@ -269,6 +276,7 @@ " \n", " MissHW_Pokegama\n", " MVP\n", + " NaN\n", " MVP\n", " PKGM5\n", " 0.0\n", @@ -276,6 +284,7 @@ " \n", " MissHW_Leech\n", " MVP\n", + " NaN\n", " MVP\n", " FEDM5\n", " NaN\n", @@ -283,6 +292,7 @@ " \n", " MissHW_Sandy\n", " MVP\n", + " NaN\n", " MVP\n", " SDYM5\n", " NaN\n", @@ -290,20 +300,23 @@ " \n", " LockDam_01\n", " MVP\n", + " NaN\n", " MVP\n", " SPAM5\n", " NaN\n", " \n", " \n", - " LockDam_02\n", - " MVP\n", + " Baldhill_Dam\n", " MVP\n", - " HSTM5\n", " NaN\n", + " MVP\n", + " BLDN8\n", + " 0.0\n", " \n", " \n", " LockDam_03\n", " MVP\n", + " NaN\n", " MVP\n", " RDWM5\n", " NaN\n", @@ -311,6 +324,7 @@ " \n", " LockDam_04\n", " MVP\n", + " NaN\n", " MVP\n", " ALMW3\n", " NaN\n", @@ -318,6 +332,7 @@ " \n", " LockDam_05\n", " MVP\n", + " NaN\n", " MVP\n", " MSCM5\n", " NaN\n", @@ -325,6 +340,7 @@ " \n", " LockDam_05a\n", " MVP\n", + " NaN\n", " MVP\n", " WIDM5\n", " NaN\n", @@ -332,6 +348,7 @@ " \n", " LockDam_06\n", " MVP\n", + " NaN\n", " MVP\n", " TREW3\n", " NaN\n", @@ -339,6 +356,7 @@ " \n", " LockDam_07\n", " MVP\n", + " NaN\n", " MVP\n", " LCRM5\n", " NaN\n", @@ -346,6 +364,7 @@ " \n", " LockDam_08\n", " MVP\n", + " NaN\n", " MVP\n", " GENW3\n", " NaN\n", @@ -353,6 +372,7 @@ " \n", " LockDam_09\n", " MVP\n", + " NaN\n", " MVP\n", " LYNW3\n", " NaN\n", @@ -360,6 +380,7 @@ " \n", " LockDam_10\n", " MVP\n", + " NaN\n", " MVP\n", " GTTI4\n", " NaN\n", @@ -367,6 +388,7 @@ " \n", " LakeDarling_Dam\n", " MVP\n", + " NaN\n", " MVP\n", " DARN8\n", " 0.0\n", @@ -374,6 +396,7 @@ " \n", " ChippewaDiv_Dam\n", " MVP\n", + " NaN\n", " MVP\n", " WTSM5\n", " NaN\n", @@ -381,54 +404,64 @@ " \n", " Orwell_Dam\n", " MVP\n", + " NaN\n", " MVP\n", " ORWM5\n", " 0.0\n", " \n", " \n", - " TraverseWR_Dam\n", + " TraverseRES_Dam\n", " MVP\n", + " NaN\n", " MVP\n", - " WHRM5\n", + " TRAM5\n", " 0.0\n", " \n", + " \n", + " LockDam_02\n", + " MVP\n", + " NaN\n", + " MVP\n", + " HSTM5\n", + " NaN\n", + " \n", " \n", "\n", "" ], "text/plain": [ - " office-id_x office-id_y alias-id attribute\n", - "location-id \n", - "TraverseRES_Dam MVP MVP TRAM5 0.0\n", - "Baldhill_Dam MVP MVP BLDN8 0.0\n", - "EauGalle_Dam MVP MVP SVPW3 0.0\n", - "MissHW_Winni MVP MVP WNBM5 0.0\n", - "MissHW_PineRiver MVP MVP CRLM5 0.0\n", - "LacQuiParle_Dam MVP MVP LAQM5 0.0\n", - "MissHW_Gull MVP MVP GLLM5 0.0\n", - "LowerSAFalls MVP MVP LSAM5 0.0\n", - "RedLake_Dam MVP MVP RRDM5 0.0\n", - "MissHW_Pokegama MVP MVP PKGM5 0.0\n", - "MissHW_Leech MVP MVP FEDM5 NaN\n", - "MissHW_Sandy MVP MVP SDYM5 NaN\n", - "LockDam_01 MVP MVP SPAM5 NaN\n", - "LockDam_02 MVP MVP HSTM5 NaN\n", - "LockDam_03 MVP MVP RDWM5 NaN\n", - "LockDam_04 MVP MVP ALMW3 NaN\n", - "LockDam_05 MVP MVP MSCM5 NaN\n", - "LockDam_05a MVP MVP WIDM5 NaN\n", - "LockDam_06 MVP MVP TREW3 NaN\n", - "LockDam_07 MVP MVP LCRM5 NaN\n", - "LockDam_08 MVP MVP GENW3 NaN\n", - "LockDam_09 MVP MVP LYNW3 NaN\n", - "LockDam_10 MVP MVP GTTI4 NaN\n", - "LakeDarling_Dam MVP MVP DARN8 0.0\n", - "ChippewaDiv_Dam MVP MVP WTSM5 NaN\n", - "Orwell_Dam MVP MVP ORWM5 0.0\n", - "TraverseWR_Dam MVP MVP WHRM5 0.0" + " office-id_x attribute_x office-id_y alias-id attribute_y\n", + "location-id \n", + "TraverseWR_Dam MVP 0.0 MVP WHRM5 0.0\n", + "EauGalle_Dam MVP NaN MVP SVPW3 0.0\n", + "MissHW_Winni MVP NaN MVP WNBM5 0.0\n", + "MissHW_PineRiver MVP NaN MVP CRLM5 0.0\n", + "LacQuiParle_Dam MVP NaN MVP LAQM5 0.0\n", + "MissHW_Gull MVP NaN MVP GLLM5 0.0\n", + "LowerSAFalls MVP NaN MVP LSAM5 0.0\n", + "RedLake_Dam MVP NaN MVP RRDM5 0.0\n", + "MissHW_Pokegama MVP NaN MVP PKGM5 0.0\n", + "MissHW_Leech MVP NaN MVP FEDM5 NaN\n", + "MissHW_Sandy MVP NaN MVP SDYM5 NaN\n", + "LockDam_01 MVP NaN MVP SPAM5 NaN\n", + "Baldhill_Dam MVP NaN MVP BLDN8 0.0\n", + "LockDam_03 MVP NaN MVP RDWM5 NaN\n", + "LockDam_04 MVP NaN MVP ALMW3 NaN\n", + "LockDam_05 MVP NaN MVP MSCM5 NaN\n", + "LockDam_05a MVP NaN MVP WIDM5 NaN\n", + "LockDam_06 MVP NaN MVP TREW3 NaN\n", + "LockDam_07 MVP NaN MVP LCRM5 NaN\n", + "LockDam_08 MVP NaN MVP GENW3 NaN\n", + "LockDam_09 MVP NaN MVP LYNW3 NaN\n", + "LockDam_10 MVP NaN MVP GTTI4 NaN\n", + "LakeDarling_Dam MVP NaN MVP DARN8 0.0\n", + "ChippewaDiv_Dam MVP NaN MVP WTSM5 NaN\n", + "Orwell_Dam MVP NaN MVP ORWM5 0.0\n", + "TraverseRES_Dam MVP NaN MVP TRAM5 0.0\n", + "LockDam_02 MVP NaN MVP HSTM5 NaN" ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -441,123 +474,41 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "TraverseRES_Dam TRAM5\n", - "Baldhill_Dam BLDN8\n", - "Storing rows 0 to 1\n", + "TraverseWR_Dam WHRM5\n", "EauGalle_Dam SVPW3\n", "MissHW_Winni WNBM5\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", "MissHW_PineRiver CRLM5\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", "LacQuiParle_Dam LAQM5\n", "error retrieving data from LacQuiParle_Dam\n", "MissHW_Gull GLLM5\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", "LowerSAFalls LSAM5\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", "RedLake_Dam RRDM5\n", "MissHW_Pokegama PKGM5\n", - "Storing rows 0 to 1\n", "MissHW_Leech FEDM5\n", "MissHW_Sandy SDYM5\n", "LockDam_01 SPAM5\n", - "LockDam_02 HSTM5\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", + "Baldhill_Dam BLDN8\n", "LockDam_03 RDWM5\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", "LockDam_04 ALMW3\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 1\n", "LockDam_05 MSCM5\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", "LockDam_05a WIDM5\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", "LockDam_06 TREW3\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", "LockDam_07 LCRM5\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", "LockDam_08 GENW3\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", "LockDam_09 LYNW3\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", "LockDam_10 GTTI4\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", - "Storing rows 0 to 2\n", "LakeDarling_Dam DARN8\n", "ChippewaDiv_Dam WTSM5\n", - "Storing rows 0 to 1\n", - "Storing rows 0 to 2\n", "Orwell_Dam ORWM5\n", - "TraverseWR_Dam WHRM5\n" + "TraverseRES_Dam TRAM5\n", + "LockDam_02 HSTM5\n" ] } ], @@ -602,7 +553,9 @@ " #change trace flag to .001\n", " d['value'] = d['value'].replace('T', str(0.001))\n", " #change S flag to missing\n", - " d['value'] = d['value'].replace('S', str(missingValueCwms))\n", + " d['value'] = d['value'].replace('S', cwms_missing_value)\n", + " # set missing qualifier\n", + " d.loc[d['value'] == cwms_missing_value, 'quality-code'] = cwms_missing_quality\n", " # Screen out A flag which is paired w/ S flag to signify a multiday total\n", " d['value'] = d['value'].replace(r'[^0-9\\.]', '', regex=True)\n", " # assign timeseries id from mapping dictionary\n", @@ -613,8 +566,7 @@ " ts_id = ts_id, units = units, office_id = OFFICE)\n", " #print(data_json)\n", " #store data\n", - " #cwms.store_timeseries(data=data_json)\n", - " write_big_ts(data_json)\n", + " cwms.store_timeseries(data=data_json)\n", " except:\n", " print(f'error retrieving data from {loc}') \n", "\n", @@ -623,7 +575,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": null, "metadata": {}, "outputs": [], "source": [] @@ -638,7 +590,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "env-cwms", "language": "python", "name": "python3" }, diff --git a/src/getNwsAcis/getNwsAcis.py b/src/getNwsAcis/getNwsAcis.py index 3e0400a..e42e8ba 100644 --- a/src/getNwsAcis/getNwsAcis.py +++ b/src/getNwsAcis/getNwsAcis.py @@ -66,7 +66,8 @@ 13:"in" } #missing value in CWMS -missingValueCwms = -340282346638528859811704183484516925440 +cwms_missing_value = -340282346638528859811704183484516925440 +cwms_missing_quality = 5 # create logger for logging logger = logging.getLogger() @@ -152,7 +153,9 @@ def main(): #change trace flag to .001 d['value'] = d['value'].replace('T', str(0.001)) #change S flag to missing - d['value'] = d['value'].replace('S', str(missingValueCwms)) + d['value'] = d['value'].replace('S', cwms_missing_value) + # set missing qualifier + d.loc[d['value'] == cwms_missing_value, 'quality-code'] = cwms_missing_quality # Screen out A flag which is paired w/ S flag to signify a multiday total d['value'] = d['value'].replace(r'[^0-9\.]', '', regex=True) # assign timeseries id from mapping dictionary diff --git a/src/getNwsAcis/getNwsIem.py b/src/getNwsAcis/getNwsIem.py new file mode 100644 index 0000000..1c24c66 --- /dev/null +++ b/src/getNwsAcis/getNwsIem.py @@ -0,0 +1,179 @@ +#!/bin/env python3 +import logging +import pandas as pd +import numpy as np +from datetime import datetime, timedelta +import cwms +from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter +# load .env python environment for storing API_KEY +# .env file can be stored a parent directory of script +# https://dev.to/jakewitcher/using-env-files-for-environment-variables-in-python-applications-55a1 +from dotenv import load_dotenv +import os +import requests +import json + +def find_first_value(list_of_dicts, key, timestamp): + for dictionary in list_of_dicts: + #print(key, dictionary[key]) + if key in dictionary and dictionary[key]!= None: + return dictionary[timestamp], dictionary[key] + return None, None # Return None if the key is not found in any dictionary + +parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) +parser.add_argument("-d", "--days_back", default=10, + help="""Days back from current time to get data. Can be decimal and integer values""" + ) +args = vars(parser.parse_args()) + +# days back to get data +days_back = int(args["days_back"]) + +# grab API variables from .env file +load_dotenv() +APIROOT = os.getenv("API_ROOT") +OFFICE = os.getenv("OFFICE") +APIKEY = os.getenv('API_KEY') +# connect to T7 +apiKey = "apikey " + APIKEY +api = cwms.api.init_session(api_root=APIROOT, api_key=apiKey) + + + + +#url +url = 'https://mesonet.agron.iastate.edu/api/1/obhistory.json?station={}&network={}&date={}&full=1' +#station link to get states +sta_index_link = 'https://mesonet.agron.iastate.edu/sites/networks.php?network=_ALL_&format=csv&nohtml=on' + + +#ts version to save as +version = 'Raw-NWS-IEM' +# SHEF to ts_id mapping +tsMapping = { + "GDIRZZZ":f"Depth-Frost.Inst.~1Week.0.{version}", + "GTIRZZZ":f"Depth-Frost-Thawed.Inst.~1Week.0.{version}", + "ICIRZZZ":f"%-Ice.Inst.~1Week.0.{version}", + "ITIRZZZ":f"Depth-Ice.Inst.~1Week.0.{version}", + "UDIRZZZ":f"Dir-Wind.Inst.~1Day.0.{version}", + "USIRZZZ":f"Speed-Wind.Inst.~1Day.0.{version}", + "TWIRZZZ":f"Temp-Water.Inst.~1Day.0.{version}", +} +#unit mapping +unitMapping = {"Depth":"in", + "Dir-Wind":"deg", + "%-Ice":"%", + "Speed-Wind":"mph", + "Temp-Water":"F" + } +#missing value in CWMS +cwms_missing_value = -340282346638528859811704183484516925440 +cwms_missing_quality = 5 + + +# create logger for logging +logger = logging.getLogger() +if (logger.hasHandlers()): + logger.handlers.clear() +handler = logging.StreamHandler() +formatter = logging.Formatter( + "%(asctime)s;%(levelname)s;%(message)s", "%Y-%m-%d %H:%M:%S") +handler.setFormatter(formatter) +logger.addHandler(handler) +logger.setLevel(logging.INFO) +logger.propagate = False + + +#logger.info(f"CDA connection: {APIROOT}") + #acis url + +#logger.info( +# f"Data will be grabbed and stored from NWS IEM from {url} repo") + +def main(): + + execution_date = datetime.now() + # Build start date and end date + edate = datetime.now() + sdate = edate - timedelta(days=days_back) + + # Create a list of dates using a for loop + date_list = [] + for i in range(days_back + 1): # +1 to include both start and end dates + current_date = sdate + timedelta(days=i) + date_list.append(current_date.strftime("%Y-%m-%d")) + + # get CWMS locations in MVP NWS ACIS Project group...this triggers what data to get + df_loc_data = cwms.get_location_group(category_id="NWS ACIS",loc_group_id="Projects",office_id=OFFICE).df + # get NWS aliases + df_loc_nws = cwms.get_location_group(category_id="Agency Aliases", loc_group_id="NWS Handbook 5 ID",office_id="CWMS").df + + # merge CWMS locations in ACIS project group with NWS aliases + nws_alias = pd.merge(df_loc_data, df_loc_nws, on='location-id').set_index('location-id') + + + #grab the station list from IEA to link the provience (easier than trying to get it from the db location table) + sta_index = pd.read_csv(sta_index_link) + sta_index = sta_index.rename(columns={'stid': 'alias-id'}) + sta_index = sta_index[['alias-id','iem_network']] + + #link the network to the location group + nws_alias = pd.merge(sta_index, nws_alias.reset_index(), on='alias-id') + #eccc_alias.index = eccc_alias['location-id'] + nws_alias.index = nws_alias['location-id'] + + # walk through locations + for index, row in nws_alias.iterrows(): + loc = index + #if loc == 'LacQuiParle_Dam': + nws_id = row['alias-id'] + network = row['iem_network'].split('_')[0]+'_COOP' + + print(loc, nws_id, network) + + for date in date_list: + + print(date) + requestUrl = url.format(nws_id, network, date) + print(requestUrl) + # get data + req = requests.get(requestUrl) + response = req.json() + #print(response) + #try: + if 'data' not in response: + break + try: + # loop through data dicts + dataList = response['data'] + if len(dataList)>0: + # loop through parameters and grab first non-none + for k, v in tsMapping.items(): + #print(k,v) + t, value = find_first_value(dataList, k, 'utc_valid') + #print(t,value) + if t: + dt = datetime.strptime(t, '%Y-%m-%dT%H:%M%z') + ts_id = loc+'.'+v + for param, u in unitMapping.items(): + if param in ts_id: + units = u + try: + #value = data[k] + + df = pd.DataFrame([[dt, value, 0]], columns = ['date-time', 'value', 'quality-code']) + #convert to json + data_json = cwms.timeseries_df_to_json(data = df, + ts_id = ts_id, units = units, office_id = OFFICE) + cwms.store_timeseries(data=data_json) + + logger.info(f'success storing {ts_id}') + except: + + logger.info(f'failed getting {ts_id}') + except: + logger.info(f'failed getting data for {loc} on {date}') + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/loadNwsCHPS/loadNwsCHPS.ipynb b/src/loadNwsCHPS/loadNwsCHPS.ipynb new file mode 100644 index 0000000..983780d --- /dev/null +++ b/src/loadNwsCHPS/loadNwsCHPS.ipynb @@ -0,0 +1,1149 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "b55f6c11-7347-40bf-b582-1d75b04b02af", + "metadata": {}, + "outputs": [], + "source": [ + "import cwms\n", + "from datetime import datetime, timedelta\n", + "import json\n", + "import pandas as pd\n", + "import xml.etree.ElementTree as ET\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9d8c3c4a-cbab-4db2-ad8d-a920cdc92259", + "metadata": {}, + "outputs": [], + "source": [ + "# load .env python environment for storing API_KEY\n", + "# .env file can be stored a parent directory of script\n", + "# https://dev.to/jakewitcher/using-env-files-for-environment-variables-in-python-applications-55a1\n", + "from dotenv import load_dotenv\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "34261af3-c615-4255-8d48-18a5285f0852", + "metadata": {}, + "outputs": [], + "source": [ + "def create_ts_id(nws_id, usace_parameterId):\n", + " 'create the TS id for the NWS location and USACE parameter'\n", + " cwms_loc = nws_alias[nws_alias['NWS_ID']== nws_id].index[0]\n", + " interval = '6Hours'\n", + " duration = '0'\n", + " d_type = 'Inst'\n", + " version = CWMS_Ver\n", + " if 'Precip' in usace_parameterId:\n", + " d_type = 'Total'\n", + " duration = '6Hours'\n", + " ts_id = f'{cwms_loc}.{usace_parameterId}.{d_type}.{interval}.{duration}.{version}'\n", + " return cwms_loc, ts_id\n", + "\n", + "def parse_nws_loc_parm_data(locId, param):\n", + " 'Parse the NWS parameter data that may be embedded in the NWS loc'\n", + " param_mod = None\n", + " if locId == 'BoundaryDiversion':\n", + " nws_id = locId\n", + " else:\n", + " nws_id = locId[:5]\n", + " if ('IN' in locId[5::]) & (\"Flow\" in param):\n", + " param = 'Flow-In'\n", + "\n", + " if ('OUT' in locId[5::]) & (\"Flow\" in param):\n", + " param = 'Flow-Out'\n", + "\n", + " if ('LOC' in locId[5::]) & (\"Flow\" in param):\n", + " param = 'Flow-Local'\n", + "\n", + "\n", + " if ('NON' in locId) & (len(locId) > 5):\n", + " param = param +'-Non_contrib'\n", + "\n", + " return nws_id, param\n", + "\n", + "def load_chps_data(file_path):\n", + " cwms_missing_value = -340282346638528859811704183484516925440\n", + " cwms_missing_quality = 5\n", + " # Define the namespace\n", + " ns = {'pi': 'http://www.wldelft.nl/fews/PI'}\n", + " \n", + " # Parse the XML file\n", + " tree = ET.parse(file_path)\n", + " root = tree.getroot()\n", + " \n", + " \n", + " # Iterate over series elements\n", + " for series in root.findall('pi:series', ns):\n", + " header = series.find('pi:header', ns)\n", + " nws_locationId = header.find('pi:locationId', ns).text\n", + " nws_parameterId = header.find('pi:parameterId', ns).text\n", + " nws_units = header.find('pi:units', ns).text\n", + " nws_missing = header.find('pi:missVal', ns).text\n", + " try:\n", + " usace_parameterId = param_mapping_dict[nws_parameterId]\n", + " except:\n", + " print(f'*****Unknown parameter {nws_locationId} {nws_parameterId} - skipping')\n", + " try:\n", + " nws_creationDate = header.find('pi:creationDate', ns).text\n", + " nws_creationTime = header.find('pi:creationTime', ns).text\n", + " except:\n", + " nws_creationDate = None\n", + " nws_creationTime = None\n", + "\n", + " nws_id, usace_parameterId = parse_nws_loc_parm_data(nws_locationId, usace_parameterId)\n", + " \n", + " #print(f\"Location ID: {nws_id}\")\n", + " try:\n", + " cwms_loc, ts_id = create_ts_id(nws_id, usace_parameterId)\n", + " \n", + " \n", + " # Iterate over event elements\n", + " dt_col = []\n", + " val_col = []\n", + " quality_col = []\n", + " for event in series.findall('pi:event', ns):\n", + " date_string = event.get('date')\n", + " time_string = event.get('time')\n", + " datetime_string = f\"{date_string} {time_string}\"\n", + " dt_object = datetime.strptime(datetime_string, '%Y-%m-%d %H:%M:%S')\n", + " value = event.get('value')\n", + " if value == nws_missing:\n", + " value = cwms_missing_value\n", + " quality_code = cwms_missing_quality\n", + " else:\n", + " quality_code = 0\n", + " dt_col.append(dt_object)\n", + " val_col.append(value)\n", + " quality_col.append(quality_code)\n", + " #print(f\"Event - Date: {date}, Time: {time}, Value: {value}\")\n", + " df = pd.DataFrame({'date-time': dt_col, 'value': val_col, 'quality-code':quality_col} )\n", + " df[\"date-time\"] = pd.to_datetime(df[\"date-time\"])\n", + " if versionDateTime:\n", + " data_json = cwms.timeseries_df_to_json(data = df, \n", + " ts_id = ts_id, units = nws_units, office_id = OFFICE, version_date= versionDateTime)\n", + " else:\n", + " data_json = cwms.timeseries_df_to_json(data = df, \n", + " ts_id = ts_id, units = nws_units, office_id = OFFICE)\n", + " #print(f'Storing {nws_locationId} {nws_parameterId} as {ts_id} with {nws_units} units and version {versionDateTime}')\n", + " #cwms.store_timeseries(data=data_json)\n", + " #print(ts_id, nws_id, nws_locationId, nws_parameterId, usace_parameterId, nws_units, nws_creationDate, nws_creationTime, versionDateTime)\n", + " \n", + " except:\n", + " print(f'***CWMS location not found for {nws_id}....skipping')\n", + "\n", + " return data_json" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "54ace64f-544c-40e7-89e3-bbd62f058a7d", + "metadata": {}, + "outputs": [], + "source": [ + "# grab API variables from .env file\n", + "load_dotenv()\n", + "APIROOT = os.getenv(\"API_ROOT\")\n", + "OFFICE = os.getenv(\"OFFICE\")\n", + "APIKEY = os.getenv('API_KEY')\n", + "#APIROOT" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c8101494-22da-4aee-9fec-8c24ef0f1165", + "metadata": {}, + "outputs": [], + "source": [ + "# api key needs to have the test \"apikey\" as a prefix to work with CDA \n", + "apiKey = \"apikey \" + APIKEY" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "67de34b5-2360-4f36-bc2b-57ceaa209646", + "metadata": {}, + "outputs": [], + "source": [ + "api = cwms.api.init_session(api_root = APIROOT, api_key = apiKey)\n", + "#defined apiroot\n", + "#cwms.api.return_base_url()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ede534b1-865f-4c5c-8676-42371139e3c0", + "metadata": {}, + "outputs": [], + "source": [ + "# nws parameter mapping to USACE paramater\n", + "param_mapping_dict = {\n", + " 'SQIN': 'Flow-Sim',\n", + " 'SPEL': 'Elev',\n", + " 'QINE': 'Flow',\n", + " 'RAIM': 'Precip-RainAndMelt',\n", + " 'MAP': 'Precip-Rain',\n", + " 'SSTG': 'Stage'\n", + "}\n", + "#missing value in CWMS\n", + "cwms_missing_value = -340282346638528859811704183484516925440\n", + "cwms_missing_quality = 5\n", + "# base version part in CWMS\n", + "CWMS_Ver_Base = \"Fcst-NCRFC-CHIPS\" \n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "7587c11e-0895-4869-a08a-3f33864c1661", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
office-idalias-idattribute
location-id
WinterMVPWERW30.0
Breckenridge-DoranMVPDRSM50.0
StBenedictMVPSTBN80.0
BakerMVPBKRM50.0
GeorgetownMVPBRGM50.0
............
HokahMVPHKHM5NaN
KlotenMVPMVCN8NaN
Grafton-DiversionMVPGFBN8NaN
ManorMVPMALQ8NaN
KelloggMVPKELM5NaN
\n", + "

455 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " office-id alias-id attribute\n", + "location-id \n", + "Winter MVP WERW3 0.0\n", + "Breckenridge-Doran MVP DRSM5 0.0\n", + "StBenedict MVP STBN8 0.0\n", + "Baker MVP BKRM5 0.0\n", + "Georgetown MVP BRGM5 0.0\n", + "... ... ... ...\n", + "Hokah MVP HKHM5 NaN\n", + "Kloten MVP MVCN8 NaN\n", + "Grafton-Diversion MVP GFBN8 NaN\n", + "Manor MVP MALQ8 NaN\n", + "Kellogg MVP KELM5 NaN\n", + "\n", + "[455 rows x 3 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# get cwms location group to link NWS station ID\n", + "Locdf = cwms.get_location_group(loc_group_id = \"NWS Handbook 5 ID\",category_id= \"Agency Aliases\", office_id = \"CWMS\").df.set_index('location-id')\n", + "Locdf" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f0f0d81d-c6b6-4e43-9a27-7abc93fb03a7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
office-idNWS_IDLoc_attribute
location-id
WinterMVPWERW30.0
Breckenridge-DoranMVPDRSM50.0
StBenedictMVPSTBN80.0
BakerMVPBKRM50.0
GeorgetownMVPBRGM50.0
............
HokahMVPHKHM5NaN
KlotenMVPMVCN8NaN
Grafton-DiversionMVPGFBN8NaN
ManorMVPMALQ8NaN
KelloggMVPKELM5NaN
\n", + "

451 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " office-id NWS_ID Loc_attribute\n", + "location-id \n", + "Winter MVP WERW3 0.0\n", + "Breckenridge-Doran MVP DRSM5 0.0\n", + "StBenedict MVP STBN8 0.0\n", + "Baker MVP BKRM5 0.0\n", + "Georgetown MVP BRGM5 0.0\n", + "... ... ... ...\n", + "Hokah MVP HKHM5 NaN\n", + "Kloten MVP MVCN8 NaN\n", + "Grafton-Diversion MVP GFBN8 NaN\n", + "Manor MVP MALQ8 NaN\n", + "Kellogg MVP KELM5 NaN\n", + "\n", + "[451 rows x 3 columns]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Grab all of the locations that have a nws station number assigned to them\n", + "nws_alias=Locdf[Locdf['alias-id'].notnull()]\n", + "\n", + "#rename the columns\n", + "nws_alias = nws_alias.rename(columns = {'alias-id': 'NWS_ID','attribute':'Loc_attribute'})\n", + "nws_alias\n", + "\n", + "\n" + ] + }, + { + "attachments": { + "123d9c5d-87f3-4ff4-8062-fd06031038e9.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "75d8bf2b-9073-4828-9f2b-f96d17c12ee5", + "metadata": {}, + "source": [ + "# Set up RFC CHPS Aliases group to map NWS ID's in the CHPs system that may not map exactly to your NWS HB 5 Id's\n", + "![image.png](attachment:123d9c5d-87f3-4ff4-8062-fd06031038e9.png)\n", + "\n", + "use the suffix _CHPS so that duplicate NWS aliases can be used in the NWS HB 5 table and the RFC CHPS Alias table" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6c577369-5336-4303-a3f0-159a6b7e90f4", + "metadata": {}, + "outputs": [], + "source": [ + "# grab the location group of RFC CHPS Aliases\n", + "tmp_df = cwms.get_location_group(loc_group_id = \"Locations\",category_id= \"RFC CHPS Aliases\", office_id = \"MVP\").df.set_index('location-id')\n", + "#Grab all of the locations that have a eccc station number assigned to them\n", + "tmp_df=tmp_df[tmp_df['alias-id'].notnull()]\n", + "\n", + "#rename the columns\n", + "tmp_df = tmp_df.rename(columns = {'alias-id': 'NWS_ID','attribute':'Loc_attribute'})\n", + "\n", + "# drop the _CHPS suffix\n", + "tmp_df['NWS_ID'] = tmp_df['NWS_ID'].str.slice(0, -5)\n", + "nws_alias.update(tmp_df)\n", + "\n", + "# find duplicates\n", + "duplicates = nws_alias[nws_alias['NWS_ID'].duplicated(keep=False)]\n", + "\n", + "#drop duplicates that are sublocations\n", + "rows_to_drop = duplicates.index[duplicates.index.str.contains('-')]\n", + "\n", + "\n", + "nws_alias = nws_alias.drop(rows_to_drop)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cf440be4-0979-4602-b5f6-ff3b784bae87", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cv_wis_wisconsi wis_wisconsin_river MSR_2024080812_MSR_main_wis_wisconsin_river.20240808133945 2024-08-08 13:39:45\n", + "***CWMS location not found for RBGW3....skipping\n", + "***Storing run time 2024-08-08 13:39:45 under cv_wis_wisconsi for file MSR_2024080812_MSR_main_wis_wisconsin_river.20240808133945\n", + "cv_rdw rdw MSR_2024080912_MSR_main_rdw.20240809143655 2024-08-09 14:36:55\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***Storing run time 2024-08-09 14:36:55 under cv_rdw for file MSR_2024080912_MSR_main_rdw.20240809143655\n", + "cva_chp chp MSR_2024081212_MSR_main_auto_chp.20240812122155 2024-08-12 12:21:55\n", + "***CWMS location not found for HOLIN....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***Storing run time 2024-08-12 12:21:55 under cva_chp for file MSR_2024081212_MSR_main_auto_chp.20240812122155\n", + "cva_chp chp MSR_2024081212_MSR_main_auto_chp.20240812130923 2024-08-12 13:09:23\n", + "***CWMS location not found for HOLIN....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***Storing run time 2024-08-12 13:09:23 under cva_chp for file MSR_2024081212_MSR_main_auto_chp.20240812130923\n", + "cva_m10_mississi m10_mississippi_river MSR_2024081212_MSR_main_auto_m10_mississippi_river.20240812122156 2024-08-12 12:21:56\n", + "***Storing run time 2024-08-12 12:21:56 under cva_m10_mississi for file MSR_2024081212_MSR_main_auto_m10_mississippi_river.20240812122156\n", + "cva_m10_mississi m10_mississippi_river MSR_2024081212_MSR_main_auto_m10_mississippi_river.20240812130924 2024-08-12 13:09:24\n", + "***Storing run time 2024-08-12 13:09:24 under cva_m10_mississi for file MSR_2024081212_MSR_main_auto_m10_mississippi_river.20240812130924\n", + "cva_m10_tribs m10_tribs MSR_2024081212_MSR_main_auto_m10_tribs.20240812122156 2024-08-12 12:21:56\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***Storing run time 2024-08-12 12:21:56 under cva_m10_tribs for file MSR_2024081212_MSR_main_auto_m10_tribs.20240812122156\n", + "cva_m10_tribs m10_tribs MSR_2024081212_MSR_main_auto_m10_tribs.20240812130924 2024-08-12 13:09:24\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***Storing run time 2024-08-12 13:09:24 under cva_m10_tribs for file MSR_2024081212_MSR_main_auto_m10_tribs.20240812130924\n", + "cva_min min MSR_2024081212_MSR_main_auto_min.20240812122153 2024-08-12 12:21:53\n", + "***CWMS location not found for ODAM5....skipping\n", + "*****Unknown parameter BSLM5 PELV - skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for COBM5....skipping\n", + "***CWMS location not found for LVNM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***Storing run time 2024-08-12 12:21:53 under cva_min for file MSR_2024081212_MSR_main_auto_min.20240812122153\n", + "cva_min min MSR_2024081212_MSR_main_auto_min.20240812130922 2024-08-12 13:09:22\n", + "***CWMS location not found for ODAM5....skipping\n", + "*****Unknown parameter BSLM5 PELV - skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for COBM5....skipping\n", + "***CWMS location not found for LVNM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***Storing run time 2024-08-12 13:09:22 under cva_min for file MSR_2024081212_MSR_main_auto_min.20240812130922\n", + "cva_rdw rdw MSR_2024081212_MSR_main_auto_rdw.20240812122154 2024-08-12 12:21:54\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***Storing run time 2024-08-12 12:21:54 under cva_rdw for file MSR_2024081212_MSR_main_auto_rdw.20240812122154\n", + "cva_rdw rdw MSR_2024081212_MSR_main_auto_rdw.20240812130923 2024-08-12 13:09:23\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***Storing run time 2024-08-12 13:09:23 under cva_rdw for file MSR_2024081212_MSR_main_auto_rdw.20240812130923\n", + "cva_red red MSR_2024081212_MSR_main_auto_red.20240812121653 2024-08-12 12:16:53\n", + "***CWMS location not found for TRA-W....skipping\n", + "***CWMS location not found for EMRN8....skipping\n", + "***CWMS location not found for ND01C....skipping\n", + "***Storing run time 2024-08-12 12:16:53 under cva_red for file MSR_2024081212_MSR_main_auto_red.20240812121653\n", + "cva_red red MSR_2024081212_MSR_main_auto_red.20240812130422 2024-08-12 13:04:22\n", + "***CWMS location not found for TRA-W....skipping\n", + "***CWMS location not found for EMRN8....skipping\n", + "***CWMS location not found for ND01C....skipping\n", + "***Storing run time 2024-08-12 13:04:22 under cva_red for file MSR_2024081212_MSR_main_auto_red.20240812130422\n", + "cva_srs srs MSR_2024081212_MSR_main_auto_srs.20240812121654 2024-08-12 12:16:54\n", + "***CWMS location not found for MMOQ8....skipping\n", + "***CWMS location not found for ND03C....skipping\n", + "***Storing run time 2024-08-12 12:16:54 under cva_srs for file MSR_2024081212_MSR_main_auto_srs.20240812121654\n", + "cva_srs srs MSR_2024081212_MSR_main_auto_srs.20240812130423 2024-08-12 13:04:23\n", + "***CWMS location not found for MMOQ8....skipping\n", + "***CWMS location not found for ND03C....skipping\n", + "***Storing run time 2024-08-12 13:04:23 under cva_srs for file MSR_2024081212_MSR_main_auto_srs.20240812130423\n", + "cva_tmn tmn MSR_2024081212_MSR_main_auto_tmn.20240812121653 2024-08-12 12:16:53\n", + "***CWMS location not found for SRBM5....skipping\n", + "***CWMS location not found for MN06C....skipping\n", + "***CWMS location not found for MN07C....skipping\n", + "***CWMS location not found for SRBM5....skipping\n", + "***Storing run time 2024-08-12 12:16:53 under cva_tmn for file MSR_2024081212_MSR_main_auto_tmn.20240812121653\n", + "cva_tmn tmn MSR_2024081212_MSR_main_auto_tmn.20240812130423 2024-08-12 13:04:23\n", + "***CWMS location not found for SRBM5....skipping\n", + "***CWMS location not found for MN06C....skipping\n", + "***CWMS location not found for MN07C....skipping\n", + "***CWMS location not found for SRBM5....skipping\n", + "***Storing run time 2024-08-12 13:04:23 under cva_tmn for file MSR_2024081212_MSR_main_auto_tmn.20240812130423\n", + "cva_tnd_red_trib tnd_red_tribs MSR_2024081212_MSR_main_auto_tnd_red_tribs.20240812121653 2024-08-12 12:16:53\n", + "***CWMS location not found for ND02C....skipping\n", + "***Storing run time 2024-08-12 12:16:53 under cva_tnd_red_trib for file MSR_2024081212_MSR_main_auto_tnd_red_tribs.20240812121653\n", + "cva_tnd_red_trib tnd_red_tribs MSR_2024081212_MSR_main_auto_tnd_red_tribs.20240812130423 2024-08-12 13:04:23\n", + "***CWMS location not found for ND02C....skipping\n", + "***Storing run time 2024-08-12 13:04:23 under cva_tnd_red_trib for file MSR_2024081212_MSR_main_auto_tnd_red_tribs.20240812130423\n", + "cva_tnd_sheyenne tnd_sheyenne_river MSR_2024081212_MSR_main_auto_tnd_sheyenne_river.20240812121653 2024-08-12 12:16:53\n", + "***Storing run time 2024-08-12 12:16:53 under cva_tnd_sheyenne for file MSR_2024081212_MSR_main_auto_tnd_sheyenne_river.20240812121653\n", + "cva_tnd_sheyenne tnd_sheyenne_river MSR_2024081212_MSR_main_auto_tnd_sheyenne_river.20240812130423 2024-08-12 13:04:23\n", + "***Storing run time 2024-08-12 13:04:23 under cva_tnd_sheyenne for file MSR_2024081212_MSR_main_auto_tnd_sheyenne_river.20240812130423\n", + "cva_wis_mississi wis_mississippi_tribs MSR_2024081212_MSR_main_auto_wis_mississippi_tribs.20240812122155 2024-08-12 12:21:55\n", + "***CWMS location not found for LIBW3....skipping\n", + "***Storing run time 2024-08-12 12:21:55 under cva_wis_mississi for file MSR_2024081212_MSR_main_auto_wis_mississippi_tribs.20240812122155\n", + "cva_wis_mississi wis_mississippi_tribs MSR_2024081212_MSR_main_auto_wis_mississippi_tribs.20240812130924 2024-08-12 13:09:24\n", + "***CWMS location not found for LIBW3....skipping\n", + "***Storing run time 2024-08-12 13:09:24 under cva_wis_mississi for file MSR_2024081212_MSR_main_auto_wis_mississippi_tribs.20240812130924\n", + "cva_wis_wisconsi wis_wisconsin_river MSR_2024081212_MSR_main_auto_wis_wisconsin_river.20240812122155 2024-08-12 12:21:55\n", + "***CWMS location not found for RBGW3....skipping\n", + "***Storing run time 2024-08-12 12:21:55 under cva_wis_wisconsi for file MSR_2024081212_MSR_main_auto_wis_wisconsin_river.20240812122155\n", + "cva_wis_wisconsi wis_wisconsin_river MSR_2024081212_MSR_main_auto_wis_wisconsin_river.20240812130924 2024-08-12 13:09:24\n", + "***CWMS location not found for RBGW3....skipping\n", + "***Storing run time 2024-08-12 13:09:24 under cva_wis_wisconsi for file MSR_2024081212_MSR_main_auto_wis_wisconsin_river.20240812130924\n", + "cv_chp chp MSR_2024081212_MSR_main_chp.20240812130619 2024-08-12 13:06:19\n", + "***CWMS location not found for HOLIN....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***Storing run time 2024-08-12 13:06:19 under cv_chp for file MSR_2024081212_MSR_main_chp.20240812130619\n", + "cv_m10_mississi m10_mississippi_river MSR_2024081212_MSR_main_m10_mississippi_river.20240812142651 2024-08-12 14:26:51\n", + "***Storing run time 2024-08-12 14:26:51 under cv_m10_mississi for file MSR_2024081212_MSR_main_m10_mississippi_river.20240812142651\n", + "cv_m10_tribs m10_tribs MSR_2024081212_MSR_main_m10_tribs.20240812130203 2024-08-12 13:02:03\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***Storing run time 2024-08-12 13:02:03 under cv_m10_tribs for file MSR_2024081212_MSR_main_m10_tribs.20240812130203\n", + "cv_min min MSR_2024081212_MSR_main_min.20240812131104 2024-08-12 13:11:04\n", + "***CWMS location not found for ODAM5....skipping\n", + "*****Unknown parameter BSLM5 PELV - skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for COBM5....skipping\n", + "***CWMS location not found for LVNM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***Storing run time 2024-08-12 13:11:04 under cv_min for file MSR_2024081212_MSR_main_min.20240812131104\n", + "cv_rdw rdw MSR_2024081212_MSR_main_rdw.20240812135205 2024-08-12 13:52:05\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***Storing run time 2024-08-12 13:52:05 under cv_rdw for file MSR_2024081212_MSR_main_rdw.20240812135205\n", + "cv_red red MSR_2024081212_MSR_main_red.20240812135755 2024-08-12 13:57:55\n", + "***CWMS location not found for TRA-W....skipping\n", + "***CWMS location not found for EMRN8....skipping\n", + "***CWMS location not found for ND01C....skipping\n", + "***Storing run time 2024-08-12 13:57:55 under cv_red for file MSR_2024081212_MSR_main_red.20240812135755\n", + "cv_srs srs MSR_2024081212_MSR_main_srs.20240812132628 2024-08-12 13:26:28\n", + "***CWMS location not found for MMOQ8....skipping\n", + "***CWMS location not found for ND03C....skipping\n", + "***Storing run time 2024-08-12 13:26:28 under cv_srs for file MSR_2024081212_MSR_main_srs.20240812132628\n", + "cv_tmn tmn MSR_2024081212_MSR_main_tmn.20240812130031 2024-08-12 13:00:31\n", + "***CWMS location not found for SRBM5....skipping\n", + "***CWMS location not found for MN06C....skipping\n", + "***CWMS location not found for MN07C....skipping\n", + "***CWMS location not found for SRBM5....skipping\n", + "***Storing run time 2024-08-12 13:00:31 under cv_tmn for file MSR_2024081212_MSR_main_tmn.20240812130031\n", + "cv_tnd_red_trib tnd_red_tribs MSR_2024081212_MSR_main_tnd_red_tribs.20240812135557 2024-08-12 13:55:57\n", + "***CWMS location not found for ND02C....skipping\n", + "***Storing run time 2024-08-12 13:55:57 under cv_tnd_red_trib for file MSR_2024081212_MSR_main_tnd_red_tribs.20240812135557\n", + "cv_tnd_sheyenne tnd_sheyenne_river MSR_2024081212_MSR_main_tnd_sheyenne_river.20240812134852 2024-08-12 13:48:52\n", + "***Storing run time 2024-08-12 13:48:52 under cv_tnd_sheyenne for file MSR_2024081212_MSR_main_tnd_sheyenne_river.20240812134852\n", + "cv_wis_mississi wis_mississippi_tribs MSR_2024081212_MSR_main_wis_mississippi_tribs.20240812132930 2024-08-12 13:29:30\n", + "***CWMS location not found for LIBW3....skipping\n", + "***Storing run time 2024-08-12 13:29:30 under cv_wis_mississi for file MSR_2024081212_MSR_main_wis_mississippi_tribs.20240812132930\n", + "cv_wis_wisconsi wis_wisconsin_river MSR_2024081212_MSR_main_wis_wisconsin_river.20240812142026 2024-08-12 14:20:26\n", + "***CWMS location not found for RBGW3....skipping\n", + "***Storing run time 2024-08-12 14:20:26 under cv_wis_wisconsi for file MSR_2024081212_MSR_main_wis_wisconsin_river.20240812142026\n", + "cvc_chp chp MSR_2024081412_MSR_CRF_chp.20240814145525 2024-08-14 14:55:25\n", + "***CWMS location not found for HOLIN....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***Storing run time 2024-08-14 14:55:25 under cvc_chp for file MSR_2024081412_MSR_CRF_chp.20240814145525\n", + "cva_chp chp MSR_2024081412_MSR_main_auto_chp.20240814122152 2024-08-14 12:21:52\n", + "***CWMS location not found for HOLIN....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***Storing run time 2024-08-14 12:21:52 under cva_chp for file MSR_2024081412_MSR_main_auto_chp.20240814122152\n", + "cva_chp chp MSR_2024081412_MSR_main_auto_chp.20240814131002 2024-08-14 13:10:02\n", + "***CWMS location not found for HOLIN....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***Storing run time 2024-08-14 13:10:02 under cva_chp for file MSR_2024081412_MSR_main_auto_chp.20240814131002\n", + "cva_m10_mississi m10_mississippi_river MSR_2024081412_MSR_main_auto_m10_mississippi_river.20240814122153 2024-08-14 12:21:53\n", + "***Storing run time 2024-08-14 12:21:53 under cva_m10_mississi for file MSR_2024081412_MSR_main_auto_m10_mississippi_river.20240814122153\n", + "cva_m10_mississi m10_mississippi_river MSR_2024081412_MSR_main_auto_m10_mississippi_river.20240814131004 2024-08-14 13:10:04\n", + "***Storing run time 2024-08-14 13:10:04 under cva_m10_mississi for file MSR_2024081412_MSR_main_auto_m10_mississippi_river.20240814131004\n", + "cva_m10_tribs m10_tribs MSR_2024081412_MSR_main_auto_m10_tribs.20240814122153 2024-08-14 12:21:53\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***Storing run time 2024-08-14 12:21:53 under cva_m10_tribs for file MSR_2024081412_MSR_main_auto_m10_tribs.20240814122153\n", + "cva_m10_tribs m10_tribs MSR_2024081412_MSR_main_auto_m10_tribs.20240814131004 2024-08-14 13:10:04\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***Storing run time 2024-08-14 13:10:04 under cva_m10_tribs for file MSR_2024081412_MSR_main_auto_m10_tribs.20240814131004\n", + "cva_min min MSR_2024081412_MSR_main_auto_min.20240814122152 2024-08-14 12:21:52\n", + "***CWMS location not found for ODAM5....skipping\n", + "*****Unknown parameter BSLM5 PELV - skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for COBM5....skipping\n", + "***CWMS location not found for LVNM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***Storing run time 2024-08-14 12:21:52 under cva_min for file MSR_2024081412_MSR_main_auto_min.20240814122152\n", + "cva_min min MSR_2024081412_MSR_main_auto_min.20240814131000 2024-08-14 13:10:00\n", + "***CWMS location not found for ODAM5....skipping\n", + "*****Unknown parameter BSLM5 PELV - skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for COBM5....skipping\n", + "***CWMS location not found for LVNM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***Storing run time 2024-08-14 13:10:00 under cva_min for file MSR_2024081412_MSR_main_auto_min.20240814131000\n", + "cva_rdw rdw MSR_2024081412_MSR_main_auto_rdw.20240814122152 2024-08-14 12:21:52\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***Storing run time 2024-08-14 12:21:52 under cva_rdw for file MSR_2024081412_MSR_main_auto_rdw.20240814122152\n", + "cva_rdw rdw MSR_2024081412_MSR_main_auto_rdw.20240814131001 2024-08-14 13:10:01\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***Storing run time 2024-08-14 13:10:01 under cva_rdw for file MSR_2024081412_MSR_main_auto_rdw.20240814131001\n", + "cva_red red MSR_2024081412_MSR_main_auto_red.20240814121652 2024-08-14 12:16:52\n", + "***CWMS location not found for TRA-W....skipping\n", + "***CWMS location not found for EMRN8....skipping\n", + "***CWMS location not found for ND01C....skipping\n", + "***Storing run time 2024-08-14 12:16:52 under cva_red for file MSR_2024081412_MSR_main_auto_red.20240814121652\n", + "cva_red red MSR_2024081412_MSR_main_auto_red.20240814130448 2024-08-14 13:04:48\n", + "***CWMS location not found for TRA-W....skipping\n", + "***CWMS location not found for EMRN8....skipping\n", + "***CWMS location not found for ND01C....skipping\n", + "***Storing run time 2024-08-14 13:04:48 under cva_red for file MSR_2024081412_MSR_main_auto_red.20240814130448\n", + "cva_red red MSR_2024081412_MSR_main_auto_red.20240814131057 2024-08-14 13:10:57\n", + "***CWMS location not found for TRA-W....skipping\n", + "***CWMS location not found for EMRN8....skipping\n", + "***CWMS location not found for ND01C....skipping\n", + "***Storing run time 2024-08-14 13:10:57 under cva_red for file MSR_2024081412_MSR_main_auto_red.20240814131057\n", + "cva_srs srs MSR_2024081412_MSR_main_auto_srs.20240814121653 2024-08-14 12:16:53\n", + "***CWMS location not found for MMOQ8....skipping\n", + "***CWMS location not found for ND03C....skipping\n", + "***Storing run time 2024-08-14 12:16:53 under cva_srs for file MSR_2024081412_MSR_main_auto_srs.20240814121653\n", + "cva_srs srs MSR_2024081412_MSR_main_auto_srs.20240814130450 2024-08-14 13:04:50\n", + "***CWMS location not found for MMOQ8....skipping\n", + "***CWMS location not found for ND03C....skipping\n", + "***Storing run time 2024-08-14 13:04:50 under cva_srs for file MSR_2024081412_MSR_main_auto_srs.20240814130450\n", + "cva_srs srs MSR_2024081412_MSR_main_auto_srs.20240814131059 2024-08-14 13:10:59\n", + "***CWMS location not found for MMOQ8....skipping\n", + "***CWMS location not found for ND03C....skipping\n", + "***Storing run time 2024-08-14 13:10:59 under cva_srs for file MSR_2024081412_MSR_main_auto_srs.20240814131059\n", + "cva_tmn tmn MSR_2024081412_MSR_main_auto_tmn.20240814121653 2024-08-14 12:16:53\n", + "***CWMS location not found for SRBM5....skipping\n", + "***CWMS location not found for MN06C....skipping\n", + "***CWMS location not found for MN07C....skipping\n", + "***CWMS location not found for SRBM5....skipping\n", + "***Storing run time 2024-08-14 12:16:53 under cva_tmn for file MSR_2024081412_MSR_main_auto_tmn.20240814121653\n", + "cva_tmn tmn MSR_2024081412_MSR_main_auto_tmn.20240814130449 2024-08-14 13:04:49\n", + "***CWMS location not found for SRBM5....skipping\n", + "***CWMS location not found for MN06C....skipping\n", + "***CWMS location not found for MN07C....skipping\n", + "***CWMS location not found for SRBM5....skipping\n", + "***Storing run time 2024-08-14 13:04:49 under cva_tmn for file MSR_2024081412_MSR_main_auto_tmn.20240814130449\n", + "cva_tmn tmn MSR_2024081412_MSR_main_auto_tmn.20240814131057 2024-08-14 13:10:57\n", + "***CWMS location not found for SRBM5....skipping\n", + "***CWMS location not found for MN06C....skipping\n", + "***CWMS location not found for MN07C....skipping\n", + "***CWMS location not found for SRBM5....skipping\n", + "***Storing run time 2024-08-14 13:10:57 under cva_tmn for file MSR_2024081412_MSR_main_auto_tmn.20240814131057\n", + "cva_tnd_red_trib tnd_red_tribs MSR_2024081412_MSR_main_auto_tnd_red_tribs.20240814121653 2024-08-14 12:16:53\n", + "***CWMS location not found for ND02C....skipping\n", + "***Storing run time 2024-08-14 12:16:53 under cva_tnd_red_trib for file MSR_2024081412_MSR_main_auto_tnd_red_tribs.20240814121653\n", + "cva_tnd_red_trib tnd_red_tribs MSR_2024081412_MSR_main_auto_tnd_red_tribs.20240814130449 2024-08-14 13:04:49\n", + "***CWMS location not found for ND02C....skipping\n", + "***Storing run time 2024-08-14 13:04:49 under cva_tnd_red_trib for file MSR_2024081412_MSR_main_auto_tnd_red_tribs.20240814130449\n", + "cva_tnd_red_trib tnd_red_tribs MSR_2024081412_MSR_main_auto_tnd_red_tribs.20240814131058 2024-08-14 13:10:58\n", + "***CWMS location not found for ND02C....skipping\n", + "***Storing run time 2024-08-14 13:10:58 under cva_tnd_red_trib for file MSR_2024081412_MSR_main_auto_tnd_red_tribs.20240814131058\n", + "cva_tnd_sheyenne tnd_sheyenne_river MSR_2024081412_MSR_main_auto_tnd_sheyenne_river.20240814121653 2024-08-14 12:16:53\n", + "***Storing run time 2024-08-14 12:16:53 under cva_tnd_sheyenne for file MSR_2024081412_MSR_main_auto_tnd_sheyenne_river.20240814121653\n", + "cva_tnd_sheyenne tnd_sheyenne_river MSR_2024081412_MSR_main_auto_tnd_sheyenne_river.20240814130450 2024-08-14 13:04:50\n", + "***Storing run time 2024-08-14 13:04:50 under cva_tnd_sheyenne for file MSR_2024081412_MSR_main_auto_tnd_sheyenne_river.20240814130450\n", + "cva_tnd_sheyenne tnd_sheyenne_river MSR_2024081412_MSR_main_auto_tnd_sheyenne_river.20240814131058 2024-08-14 13:10:58\n", + "***Storing run time 2024-08-14 13:10:58 under cva_tnd_sheyenne for file MSR_2024081412_MSR_main_auto_tnd_sheyenne_river.20240814131058\n", + "cva_wis_mississi wis_mississippi_tribs MSR_2024081412_MSR_main_auto_wis_mississippi_tribs.20240814122153 2024-08-14 12:21:53\n", + "***CWMS location not found for LIBW3....skipping\n", + "***Storing run time 2024-08-14 12:21:53 under cva_wis_mississi for file MSR_2024081412_MSR_main_auto_wis_mississippi_tribs.20240814122153\n", + "cva_wis_mississi wis_mississippi_tribs MSR_2024081412_MSR_main_auto_wis_mississippi_tribs.20240814131003 2024-08-14 13:10:03\n", + "***CWMS location not found for LIBW3....skipping\n", + "***Storing run time 2024-08-14 13:10:03 under cva_wis_mississi for file MSR_2024081412_MSR_main_auto_wis_mississippi_tribs.20240814131003\n", + "cva_wis_wisconsi wis_wisconsin_river MSR_2024081412_MSR_main_auto_wis_wisconsin_river.20240814122153 2024-08-14 12:21:53\n", + "***CWMS location not found for RBGW3....skipping\n", + "***Storing run time 2024-08-14 12:21:53 under cva_wis_wisconsi for file MSR_2024081412_MSR_main_auto_wis_wisconsin_river.20240814122153\n", + "cva_wis_wisconsi wis_wisconsin_river MSR_2024081412_MSR_main_auto_wis_wisconsin_river.20240814131003 2024-08-14 13:10:03\n", + "***CWMS location not found for RBGW3....skipping\n", + "***Storing run time 2024-08-14 13:10:03 under cva_wis_wisconsi for file MSR_2024081412_MSR_main_auto_wis_wisconsin_river.20240814131003\n", + "cva_wis_wisconsi wis_wisconsin_river MSR_2024081412_MSR_main_auto_wis_wisconsin_river.20240814131056 2024-08-14 13:10:56\n", + "***CWMS location not found for RBGW3....skipping\n", + "***Storing run time 2024-08-14 13:10:56 under cva_wis_wisconsi for file MSR_2024081412_MSR_main_auto_wis_wisconsin_river.20240814131056\n", + "cv_chp chp MSR_2024081412_MSR_main_chp.20240814131113 2024-08-14 13:11:13\n", + "***CWMS location not found for HOLIN....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***CWMS location not found for LEPW3....skipping\n", + "***CWMS location not found for RILW3....skipping\n", + "***Storing run time 2024-08-14 13:11:13 under cv_chp for file MSR_2024081412_MSR_main_chp.20240814131113\n", + "cv_m10_mississi m10_mississippi_river MSR_2024081412_MSR_main_m10_mississippi_river.20240814141206 2024-08-14 14:12:06\n", + "***Storing run time 2024-08-14 14:12:06 under cv_m10_mississi for file MSR_2024081412_MSR_main_m10_mississippi_river.20240814141206\n", + "cv_m10_mississi m10_mississippi_river MSR_2024081412_MSR_main_m10_mississippi_river.20240814142456 2024-08-14 14:24:56\n", + "***Storing run time 2024-08-14 14:24:56 under cv_m10_mississi for file MSR_2024081412_MSR_main_m10_mississippi_river.20240814142456\n", + "cv_m10_tribs m10_tribs MSR_2024081412_MSR_main_m10_tribs.20240814124931 2024-08-14 12:49:31\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for LKZM5....skipping\n", + "***CWMS location not found for OXBM5....skipping\n", + "***CWMS location not found for PILM5....skipping\n", + "***CWMS location not found for PNLM5....skipping\n", + "***CWMS location not found for PTNM5....skipping\n", + "***CWMS location not found for RICI4....skipping\n", + "***CWMS location not found for RUDM5....skipping\n", + "***CWMS location not found for THLM5....skipping\n", + "***Storing run time 2024-08-14 12:49:31 under cv_m10_tribs for file MSR_2024081412_MSR_main_m10_tribs.20240814124931\n", + "cv_min min MSR_2024081412_MSR_main_min.20240814124610 2024-08-14 12:46:10\n", + "***CWMS location not found for ODAM5....skipping\n", + "*****Unknown parameter BSLM5 PELV - skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for COBM5....skipping\n", + "***CWMS location not found for LVNM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***CWMS location not found for ODAM5....skipping\n", + "***Storing run time 2024-08-14 12:46:10 under cv_min for file MSR_2024081412_MSR_main_min.20240814124610\n", + "cv_rdw rdw MSR_2024081412_MSR_main_rdw.20240814131319 2024-08-14 13:13:19\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for GTBM5....skipping\n", + "***CWMS location not found for MCAM5....skipping\n", + "***CWMS location not found for PRNM5....skipping\n", + "***Storing run time 2024-08-14 13:13:19 under cv_rdw for file MSR_2024081412_MSR_main_rdw.20240814131319\n", + "cv_red red MSR_2024081412_MSR_main_red.20240814132516 2024-08-14 13:25:16\n", + "***CWMS location not found for TRA-W....skipping\n", + "***CWMS location not found for EMRN8....skipping\n", + "***CWMS location not found for ND01C....skipping\n", + "***Storing run time 2024-08-14 13:25:16 under cv_red for file MSR_2024081412_MSR_main_red.20240814132516\n", + "cv_tmn tmn MSR_2024081412_MSR_main_tmn.20240814123505 2024-08-14 12:35:05\n", + "***CWMS location not found for SRBM5....skipping\n", + "***CWMS location not found for MN06C....skipping\n", + "***CWMS location not found for MN07C....skipping\n", + "***CWMS location not found for SRBM5....skipping\n", + "***Storing run time 2024-08-14 12:35:05 under cv_tmn for file MSR_2024081412_MSR_main_tmn.20240814123505\n", + "cv_tnd_red_trib tnd_red_tribs MSR_2024081412_MSR_main_tnd_red_tribs.20240814124506 2024-08-14 12:45:06\n", + "***CWMS location not found for ND02C....skipping\n", + "***Storing run time 2024-08-14 12:45:06 under cv_tnd_red_trib for file MSR_2024081412_MSR_main_tnd_red_tribs.20240814124506\n", + "cv_tnd_sheyenne tnd_sheyenne_river MSR_2024081412_MSR_main_tnd_sheyenne_river.20240814123540 2024-08-14 12:35:40\n", + "***Storing run time 2024-08-14 12:35:40 under cv_tnd_sheyenne for file MSR_2024081412_MSR_main_tnd_sheyenne_river.20240814123540\n", + "cv_wis_mississi wis_mississippi_tribs MSR_2024081412_MSR_main_wis_mississippi_tribs.20240814124419 2024-08-14 12:44:19\n", + "***CWMS location not found for LIBW3....skipping\n", + "***Storing run time 2024-08-14 12:44:19 under cv_wis_mississi for file MSR_2024081412_MSR_main_wis_mississippi_tribs.20240814124419\n", + "cv_wis_wisconsi wis_wisconsin_river MSR_2024081412_MSR_main_wis_wisconsin_river.20240814141109 2024-08-14 14:11:09\n", + "***CWMS location not found for RBGW3....skipping\n", + "***Storing run time 2024-08-14 14:11:09 under cv_wis_wisconsi for file MSR_2024081412_MSR_main_wis_wisconsin_river.20240814141109\n", + "cv_wis_wisconsi wis_wisconsin_river MSR_2024081412_MSR_main_wis_wisconsin_river.20240814141634 2024-08-14 14:16:34\n", + "***CWMS location not found for RBGW3....skipping\n", + "***Storing run time 2024-08-14 14:16:34 under cv_wis_wisconsi for file MSR_2024081412_MSR_main_wis_wisconsin_river.20240814141634\n" + ] + } + ], + "source": [ + "directory = './chps_dir'\n", + "onlyfiles = [filename for filename in os.listdir(directory) if os.path.isfile(os.path.join(directory, filename)) and 'scour' not in filename]\n", + "\n", + "# walk through files\n", + "for filename in onlyfiles:\n", + " #print('%s being processed' %(filename))\n", + " Filetime = filename.split(\".\")[1]\n", + " fmt = '%Y%m%d%H%M%S' \n", + " fDateTime = datetime.strptime(Filetime, fmt)\n", + " if 'auto' in filename:\n", + " fileBaseName = filename.split('MSR_main_auto_')[1].split('.')[0]\n", + " versionDateTime = textKey = None\n", + " CWMS_Ver = CWMS_Ver_Base+\"-Auto\"\n", + " textKey = 'cva_'+fileBaseName[0:12]\n", + " elif 'CRF' in filename:\n", + " fileBaseName = filename.split('MSR_CRF_')[1].split('.')[0]\n", + " versionDateTime = textKey = None\n", + " CWMS_Ver = CWMS_Ver_Base+\"-CRF\"\n", + " textKey = 'cvc_'+fileBaseName[0:12]\n", + " else:\n", + " fileBaseName = filename.split('MSR_main_')[1].split('.')[0]\n", + " # set version datetime to current date and 0111 time to avoid too many versions\n", + " versionDateTime = fDateTime.replace(hour=1, minute=11, second=0)\n", + " versionDateTime = versionDateTime.strftime(\"%Y-%m-%dT%H:%M:%S.%f\")[:-3] + \"Z\"\n", + " #versionDate = fDateTime.strftime(f'%d%b%Y, {versionTime}')\n", + " # standard text id to save last runtime to\n", + " textKey = 'cv_'+fileBaseName[0:12]\n", + " CWMS_Ver = CWMS_Ver_Base\n", + "\n", + " print(textKey, fileBaseName, filename, fDateTime)\n", + " # format CHPS data\n", + " fullPath = os.path.join(directory, filename)\n", + " # parse chps and put into a json dictionary for cwms-python store\n", + " data_json = load_chps_data(fullPath)\n", + "\n", + " \n", + " # store file date under standard text id key\n", + " print(f'***Storing run time {fDateTime} under {textKey} for file {filename}')\n", + " msg = cwms.standard_text_to_json(text_id = textKey, standard_text =fDateTime, office_id = OFFICE)\n", + " cwms.store_standard_text(msg)\n", + " #textStore = cwms.get_standard_text(text_id = textKey, office_id = 'MVP')\n", + "\n", + "\n", + " " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "env-cwms", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/loadNwsCHPS/loadNwsCHPS.py b/src/loadNwsCHPS/loadNwsCHPS.py new file mode 100644 index 0000000..0cb5727 --- /dev/null +++ b/src/loadNwsCHPS/loadNwsCHPS.py @@ -0,0 +1,262 @@ +#!/usr/bin/env python +# coding: utf-8 + +import cwms +from datetime import datetime, timedelta +import json +import pandas as pd +import xml.etree.ElementTree as ET +import argparse +import logging + + +# load .env python environment for storing API_KEY +# .env file can be stored a parent directory of script +# https://dev.to/jakewitcher/using-env-files-for-environment-variables-in-python-applications-55a1 +from dotenv import load_dotenv +import os + + +def create_ts_id(nws_id, usace_parameterId): + 'create the TS id for the NWS locatoin and USACE parameter' + cwms_loc = nws_alias[nws_alias['NWS_ID']== nws_id].index[0] + interval = '6Hours' + duration = '0' + d_type = 'Inst' + version = CWMS_Ver + if 'Precip' in usace_parameterId: + d_type = 'Total' + duration = '6Hours' + ts_id = f'{cwms_loc}.{usace_parameterId}.{d_type}.{interval}.{duration}.{version}' + return cwms_loc, ts_id + +def parse_nws_loc_parm_data(locId, param): + 'Parse the NWS parameter data that may be embedded in the NWS loc' + param_mod = None + if locId == 'BoundaryDiversion': + nws_id = locId + else: + nws_id = locId[:5] + if ('IN' in locId[5::]) & ("Flow" in param): + param = 'Flow-In' + + if ('OUT' in locId[5::]) & ("Flow" in param): + param = 'Flow-Out' + + if ('LOC' in locId[5::]) & ("Flow" in param): + param = 'Flow-Local' + + + if ('NON' in locId) & (len(locId) > 5): + param = param +'-Non_contrib' + + return nws_id, param + +def load_chps_data(file_path): + cwms_missing_value = -340282346638528859811704183484516925440 + cwms_missing_quality = 5 + logging.info(f'\n\nProcessing {file_path}') + # Define the namespace + ns = {'pi': 'http://www.wldelft.nl/fews/PI'} + + # Parse the XML file + tree = ET.parse(file_path) + root = tree.getroot() + + + # Iterate over series elements + for series in root.findall('pi:series', ns): + header = series.find('pi:header', ns) + nws_locationId = header.find('pi:locationId', ns).text + nws_parameterId = header.find('pi:parameterId', ns).text + nws_units = header.find('pi:units', ns).text + nws_missing = header.find('pi:missVal', ns).text + try: + usace_parameterId = param_mapping_dict[nws_parameterId] + except: + logging.error(f'*****Unknown parameter {nws_locationId} {nws_parameterId} - skipping') + try: + nws_creationDate = header.find('pi:creationDate', ns).text + nws_creationTime = header.find('pi:creationTime', ns).text + except: + nws_creationDate = None + nws_creationTime = None + + nws_id, usace_parameterId = parse_nws_loc_parm_data(nws_locationId, usace_parameterId) + + #print(f"Location ID: {nws_id}") + try: + cwms_loc, ts_id = create_ts_id(nws_id, usace_parameterId) + + + # Iterate over event elements + dt_col = [] + val_col = [] + quality_col = [] + for event in series.findall('pi:event', ns): + date_string = event.get('date') + time_string = event.get('time') + datetime_string = f"{date_string} {time_string}" + dt_object = datetime.strptime(datetime_string, '%Y-%m-%d %H:%M:%S') + value = event.get('value') + if value == nws_missing: + value = cwms_missing_value + quality_code = cwms_missing_quality + else: + quality_code = 0 + dt_col.append(dt_object) + val_col.append(value) + quality_col.append(quality_code) + #print(f"Event - Date: {date}, Time: {time}, Value: {value}") + df = pd.DataFrame({'date-time': dt_col, 'value': val_col, 'quality-code':quality_col} ) + df["date-time"] = pd.to_datetime(df["date-time"]) + if versionDateTime: + data_json = cwms.timeseries_df_to_json(data = df, + ts_id = ts_id, units = nws_units, office_id = OFFICE, version_date= versionDateTime) + else: + data_json = cwms.timeseries_df_to_json(data = df, + ts_id = ts_id, units = nws_units, office_id = OFFICE) + logging.info(f'Storing {nws_locationId} {nws_parameterId} as {ts_id} with {nws_units} units and version {versionDateTime}') + cwms.store_timeseries(data=data_json) + #print(ts_id, nws_id, nws_locationId, nws_parameterId, usace_parameterId, nws_units, nws_creationDate, nws_creationTime, versionDateTime) + + except: + print(f'***CWMS location not found for {nws_id}....skipping') + + return + +# setup argument for filename +parser = argparse.ArgumentParser(description='Load pi xml chps file.') +parser.add_argument('filename', type=str, help='The name of the file') +args = vars(parser.parse_args()) +filename = args["filename"] + +# create logger for logging +logger = logging.getLogger() +if (logger.hasHandlers()): + logger.handlers.clear() +handler = logging.StreamHandler() +formatter = logging.Formatter( + "%(asctime)s;%(levelname)s;%(message)s", "%Y-%m-%d %H:%M:%S") +handler.setFormatter(formatter) +logger.addHandler(handler) +logger.setLevel(logging.INFO) +logger.propagate = False + +# grab API variables from .env file +load_dotenv() +APIROOT = os.getenv("API_ROOT") +OFFICE = os.getenv("OFFICE") +APIKEY = os.getenv('API_KEY') +APIROOT + +# api key needs to have the test "apikey" as a prefix to work with CDA +apiKey = "apikey " + APIKEY + +api = cwms.api.init_session(api_root = APIROOT, api_key = apiKey) +#defined apiroot +cwms.api.return_base_url() + + +# nws parameter mapping to USACE paramater +param_mapping_dict = { + 'SQIN': 'Flow-Sim', + 'SPEL': 'Elev', + 'QINE': 'Flow', + 'RAIM': 'Precip-RainAndMelt', + 'MAP': 'Precip-Rain', + 'SSTG': 'Stage' +} +# missing value in CWMS +missingCwmsValue = -340282346638528859811704183484516925440 + +# base version part in CWMS +CWMS_Ver_Base = "Fcst-NCRFC-CHIPS" + +# get cwms location group to link NWS station ID +Locdf = cwms.get_location_group(loc_group_id = "NWS Handbook 5 ID",category_id= "Agency Aliases", office_id = "CWMS").df.set_index('location-id') + + + + +#Grab all of the locations that have a eccc station number assigned to them +nws_alias=Locdf[Locdf['alias-id'].notnull()] + +#rename the columns +nws_alias = nws_alias.rename(columns = {'alias-id': 'NWS_ID','attribute':'Loc_attribute'}) +nws_alias + + + + +# # Set up RFC CHPS Aliases group to map NWS ID's in the CHPs system that may not map exactly to your NWS HB 5 Id's +# ![image.png](attachment:123d9c5d-87f3-4ff4-8062-fd06031038e9.png) +# +# use the suffix _CHPS so that duplicate NWS aliases can be used in the NWS HB 5 table and the RFC CHPS Alias table + + + +# grab the location group of RFC CHPS Aliases +tmp_df = cwms.get_location_group(loc_group_id = "Locations",category_id= "RFC CHPS Aliases", office_id = "MVP").df.set_index('location-id') +#Grab all of the locations that have a eccc station number assigned to them +tmp_df=tmp_df[tmp_df['alias-id'].notnull()] + +#rename the columns +tmp_df = tmp_df.rename(columns = {'alias-id': 'NWS_ID','attribute':'Loc_attribute'}) + +# drop the _CHPS suffix +tmp_df['NWS_ID'] = tmp_df['NWS_ID'].str.slice(0, -5) +nws_alias.update(tmp_df) + +# find duplicates +duplicates = nws_alias[nws_alias['NWS_ID'].duplicated(keep=False)] + +#drop duplicates that are sublocations +rows_to_drop = duplicates.index[duplicates.index.str.contains('-')] + + +nws_alias = nws_alias.drop(rows_to_drop) + + + + + +#print('%s being processed' %(filename)) +Filetime = filename.split(".")[1] +fmt = '%Y%m%d%H%M%S' +fDateTime = datetime.strptime(Filetime, fmt) +if 'auto' in filename: + fileBaseName = filename.split('MSR_main_auto_')[1].split('.')[0] + versionDateTime = textKey = None + CWMS_Ver = CWMS_Ver_Base+"-Auto" + textKey = 'cva_'+fileBaseName[0:12] +elif 'CRF' in filename: + fileBaseName = filename.split('MSR_CRF_')[1].split('.')[0] + versionDateTime = textKey = None + CWMS_Ver = CWMS_Ver_Base+"-CRF" + textKey = 'cvc_'+fileBaseName[0:12] +else: + fileBaseName = filename.split('MSR_main_')[1].split('.')[0] + # set version datetime to current date and 0111 time to avoid too many versions + versionDateTime = fDateTime.replace(hour=1, minute=11, second=0) + versionDateTime = versionDateTime.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z" + #versionDate = fDateTime.strftime(f'%d%b%Y, {versionTime}') + # standard text id to save last runtime to + textKey = 'cv_'+fileBaseName[0:12] + CWMS_Ver = CWMS_Ver_Base + +#logging.info(textKey, fileBaseName, filename, str(fDateTime)) +# format CHPS data +#fullPath = os.path.join(directory, filename) +# parse chps and put into a json dictionary for cwms-python store +load_chps_data(filename) + + +# store file date under standard text id key +logging.info(f'***Storing run time {fDateTime} under {textKey} for file {filename}') +msg = cwms.standard_text_to_json(text_id = textKey, standard_text =fDateTime, office_id = OFFICE) +cwms.store_standard_text(msg) +#textStore = cwms.get_standard_text(text_id = textKey, office_id = 'MVP') + + +