From 4b7f321df97fe767b50572cbbebe6c3ac0f0a02e Mon Sep 17 00:00:00 2001 From: Micah Sandusky Date: Wed, 19 Jun 2024 11:00:46 -0600 Subject: [PATCH 1/8] Start implementing NWS Forecast class. Still a work in progress --- metloom/pointdata/__init__.py | 4 +- metloom/pointdata/nws_forecast.py | 291 ++++++++++++++++++++++++++++++ metloom/variables.py | 22 +++ 3 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 metloom/pointdata/nws_forecast.py diff --git a/metloom/pointdata/__init__.py b/metloom/pointdata/__init__.py index ef9397c..79e3c86 100644 --- a/metloom/pointdata/__init__.py +++ b/metloom/pointdata/__init__.py @@ -6,9 +6,11 @@ from .geosphere_austria import GeoSphereHistPointData, GeoSphereCurrentPointData from .norway import MetNorwayPointData from .cues import CuesLevel1 +from .nws_forecast import NWSForecastPointData __all__ = [ "PointData", "PointDataCollection", "CDECPointData", "SnotelPointData", "MesowestPointData", "USGSPointData", "GeoSphereHistPointData", - "GeoSphereCurrentPointData", "CuesLevel1", "MetNorwayPointData" + "GeoSphereCurrentPointData", "CuesLevel1", "MetNorwayPointData", + "NWSForecastPointData" ] diff --git a/metloom/pointdata/nws_forecast.py b/metloom/pointdata/nws_forecast.py new file mode 100644 index 0000000..92a0b7a --- /dev/null +++ b/metloom/pointdata/nws_forecast.py @@ -0,0 +1,291 @@ +import logging +from datetime import timedelta, timezone +from typing import List +import pandas as pd +import geopandas as gpd +import requests +from geopandas import GeoDataFrame + +from metloom.dataframe_utils import merge_df, resample_whole_df +from metloom.pointdata.base import PointData +from metloom.variables import SensorDescription, NWSForecastVariables + + +LOG = logging.getLogger(__name__) + + +class NWSForecastPointData(PointData): + """ + Implementation for NWS forecast API + https://www.weather.gov/documentation/services-web-api + + We can call the points api to get the URL for the forecast, i.e. + https://api.weather.gov/points/42,-119 + + In this example, 3 forecast URLs are available + + "forecast": "https://api.weather.gov/gridpoints/BOI/28,28/forecast", + "forecastHourly": "https://api.weather.gov/gridpoints/BOI/28,28/forecast/hourly", + "forecastGridData": "https://api.weather.gov/gridpoints/BOI/28,28", + + forecast can be used to return the 12 hour increments + + forecastHourly returns hourly data (hourly in local tz) + + forecastGridData returns the 'raw' grid data (hourly UTC). + + We will use the `forecastGridData` endpoint for this implementation + + The API returns data from a grid, meaning the `geometry` column + in the returned geodataframes will represent the **CENTER** of + the forecast grid cell. + + """ + DATASOURCE = "NWS Forecast" + ALLOWED_VARIABLES = NWSForecastVariables + URL = "https://api.weather.gov/" + POINTS_FROM_GEOM_DEFAULTS = { + 'within_geometry': True, + 'token_json': "~/.frost_token.json", + 'buffer': 0.0 + } + + def __init__( + self, station_id, name, + initial_metadata=None, metadata=None, + ): + """ + Args: + station_id: id of station + name: name of station + initial_metadata: shapely point required to find the + forecast grid cell + metadata: optional metadata for the station (shapely point) + """ + if initial_metadata is None: + raise ValueError("Initial metadata is required for the NWS Forecast class") + super(NWSForecastPointData, self).__init__( + station_id, name, metadata=metadata + ) + self._inital_metadata = initial_metadata + # default UTC time + self._tzinfo = timezone(timedelta(hours=0)) + + # set the forecast grid parameters + self._gridx = None + self._gridy = None + self._office = None + self._grid_outline = None + + def _get_initial_metadata(self): + """ + Get all metadata from the API for one point. + """ + # use the initial metadata to find the grid points for the forecast + resp = requests.get( + self.URL + + f"/points/{self._inital_metadata.y},{self._inital_metadata.x}" + ) + resp.raise_for_status() + data = resp.json() + properties = data["properties"] + + return properties + + def _get_metadata(self): + """ + See docstring for PointData._get_metadata + This setts the _metadata and _gridx and _gridy parameters + """ + properties = self._get_initial_metadata() + self._gridx = properties["gridX"] + self._gridy = properties["gridY"] + self._office = properties["gridId"] + + # use the grid points to find the center of the forecast cell + + url = f"https://api.weather.gov/gridpoints/" \ + f"{self._office}/{self._gridx},{self._gridy}" + resp = requests.get(url) + resp.raise_for_status() + data = resp.json() + grid_properties = data["properties"] + # Parse the polygon into a geodataframe + df_loc = gpd.GeoDataFrame.from_features([data]) + self._grid_outline = df_loc.geometry.values[0] + # find the center + center = df_loc.centroid[0] + + return gpd.points_from_xy( + [center.x], + [center.y], + z=[grid_properties["elevation"]["value"] * 3.28084] # convert to ft + )[0] + + def _get_observations(self): + """ + Get the hourly data for a 7 day forecast + """ + # ensure we have office, gridx, and gridy set + if self._metadata is None: + self._get_metadata() + url = f"https://api.weather.gov/gridpoints/" \ + f"{self._office}/{self._gridx},{self._gridy}" + resp = requests.get(url) + resp.raise_for_status() + data = resp.json() + return data["properties"] + + def _sensor_response_to_df( + self, response_data, sensor, final_columns, + resample_duration=None + ): + """ + Process the response from the API into a dataframe for 1 sensor + + Args: + response_data: list of entries from the API + sensor: single variable object + final_columns: expected columns + resample_duration: if a resample is desired, a duration that can + be parsed by pandas + + Returns + Geodataframe of data + """ + # Get the list of response data + sensor_data = response_data[sensor.code] + unit_str = sensor_data["uom"].split("wmoUnit:")[-1] + df = pd.DataFrame.from_records(sensor_data["values"]) + + # Rename and resample + column_map = { + "validTime": "datetime", + "value": sensor.name, + } + df.rename( + columns=column_map, + inplace=True, + ) + + # add other expected columns + df[f"{sensor.name}_units"] = [unit_str] * len(df) + df[f"site"] = [self.id] * len(df) + df["datetime"] = pd.to_datetime(df["datetime"]) + + # keep the column names + final_columns += [ + sensor.name, f"{sensor.name}_units", + ] + + frequency = pd.infer_freq(pd.DatetimeIndex(df["datetime"])) + df = GeoDataFrame( + df, geometry=[self.metadata] * len(df) + ).set_index("datetime") + + # resample to the desired duration + if frequency != resample_duration and resample_duration is not None: + df = resample_whole_df( + df, sensor, + interval=resample_duration + ) + + df = GeoDataFrame(df, geometry=df["geometry"]) + + # double check utc conversion + df = df.tz_convert(self.desired_tzinfo) + + # set index so joining works + df = df.filter(final_columns) + df = df.loc[pd.notna(df[sensor.name])] + return df + + def _get_data( + self, + variables: List[SensorDescription], + desired_duration=None, + ): + """ + Args: + variables: List of metloom.variables.SensorDescription object + from self.ALLOWED_VARIABLES + desired_duration: desired resample duration ("D", "H"). Data is + hourly be default + Returns: + GeoDataFrame of data, indexed on datetime, site + """ + + df = None + final_columns = ["geometry", "site"] + # Get data from the API + response_data = self._get_observations() + if response_data: + # Parse data for each variable + for sensor in variables: + # TODO: how does resampling of non-hourly precip work + sensor_df = self._sensor_response_to_df( + response_data, sensor, final_columns, + resample_duration=desired_duration + ) + df = merge_df(df, sensor_df) + + if df is not None: + if len(df.index) > 0: + # Set the datasource + df["datasource"] = [self.DATASOURCE] * len(df.index) + df.reset_index(inplace=True) + df.set_index(keys=["datetime", "site"], inplace=True) + df.index.set_names(["datetime", "site"], inplace=True) + else: + df = None + self.validate_sensor_df(df) + return df + + def get_daily_forecast( + self, + variables: List[SensorDescription], + ): + """ + Get a geopandas dataframe with daily results for a 7 day forecast. + The geometry column will be the center of the forecast gridcell + + Args: + variables: list of variables to return + """ + return self._get_data(variables, desired_duration="D") + + def get_hourly_forecast( + self, + variables: List[SensorDescription], + ): + """ + Get a geopandas dataframe with hourly results for a 7 day forecast. + The geometry column will be the center of the forecast gridcell + + Args: + variables: list of variables to return + """ + # No desired duration necessary because the default is hourly data + return self._get_data(variables) + + @classmethod + def points_from_geometry( + cls, + geometry: gpd.GeoDataFrame, + variables: List[SensorDescription], + **kwargs + ): + """ + See docstring for PointData.points_from_geometry + + Args: + geometry: GeoDataFrame for shapefile from gpd.read_file + variables: List of SensorDescription + within_geometry: filter the points to within the shapefile + instead of just the extents. Default True + buffer: buffer added to search box + + Returns: + PointDataCollection + """ + raise NotImplementedError("Not implemented for NWS") diff --git a/metloom/variables.py b/metloom/variables.py index 5e9cdd4..f5b43b1 100644 --- a/metloom/variables.py +++ b/metloom/variables.py @@ -346,3 +346,25 @@ class MetNorwayVariables(VariableBase): " Each tip is registered along with the time stamp for the tip." " This is the basis for calcutation of precipitation sum per minute" ) + + +class NWSForecastVariables(VariableBase): + """ + See https://api.weather.gov/gridpoints/BOI/28,28 + for examples of variables + """ + # Precipitation is not returned hourly + PRECIPITATIONACCUM = SensorDescription( + "quantitativePrecipitation", "ACCUMULATED PRECIPITATION", + accumulated=True + ) + PRECIPITATION = SensorDescription( + "quantitativePrecipitation", "PRECIPITATION", + accumulated=False + ) + TEMP = SensorDescription( + "temperature", "AIR TEMP", + ) + DEWPOINT = SensorDescription("dewpoint", "DEW POINT TEMPERATURE") + RH = SensorDescription("relativeHumidity", "RELATIVE HUMIDITY") + From 475c6f4524d71f41e696fb68c952e44010bbecb2 Mon Sep 17 00:00:00 2001 From: Micah Sandusky Date: Wed, 19 Jun 2024 11:27:49 -0600 Subject: [PATCH 2/8] Issue #110 - working out some hourly vs daily bugs --- metloom/pointdata/nws_forecast.py | 50 +++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/metloom/pointdata/nws_forecast.py b/metloom/pointdata/nws_forecast.py index 92a0b7a..c29bc41 100644 --- a/metloom/pointdata/nws_forecast.py +++ b/metloom/pointdata/nws_forecast.py @@ -168,29 +168,40 @@ def _sensor_response_to_df( inplace=True, ) + # parse midway through dates + # (example datetime is '2024-06-19T04:00:00+00:00/PT1H') + date_starts = pd.to_datetime( + df["datetime"].str.split("/").apply(lambda x: x[0]) + ) + date_durations = pd.to_timedelta( + df["datetime"].str.split("/").apply(lambda x: x[1]) + ) + date_mids = date_starts + date_durations / 2.0 + df["datetime"] = date_mids + df = df.set_index("datetime") + + # resample to the desired duration + # TODO: Issue + # gridded data is not consistent with duration + # hourly data does not have precip mass + if resample_duration is not None: + df = resample_whole_df( + df, sensor, + interval=resample_duration + ) + # add other expected columns df[f"{sensor.name}_units"] = [unit_str] * len(df) df[f"site"] = [self.id] * len(df) - df["datetime"] = pd.to_datetime(df["datetime"]) # keep the column names final_columns += [ sensor.name, f"{sensor.name}_units", ] - frequency = pd.infer_freq(pd.DatetimeIndex(df["datetime"])) df = GeoDataFrame( df, geometry=[self.metadata] * len(df) - ).set_index("datetime") - - # resample to the desired duration - if frequency != resample_duration and resample_duration is not None: - df = resample_whole_df( - df, sensor, - interval=resample_duration - ) - - df = GeoDataFrame(df, geometry=df["geometry"]) + ) # double check utc conversion df = df.tz_convert(self.desired_tzinfo) @@ -265,7 +276,20 @@ def get_hourly_forecast( Args: variables: list of variables to return """ - # No desired duration necessary because the default is hourly data + return self._get_data(variables, desired_duration="H") + + def get_forecast( + self, + variables: List[SensorDescription], + ): + """ + Get a geopandas dataframe with hourly results for a 7 day forecast. + The geometry column will be the center of the forecast gridcell + + Args: + variables: list of variables to return + """ + # Do not resample return self._get_data(variables) @classmethod From 7ed8495bae92bdf2e0e35e9b04e826523a90c00b Mon Sep 17 00:00:00 2001 From: Micah Sandusky Date: Tue, 25 Jun 2024 16:26:05 -0600 Subject: [PATCH 3/8] start NWS tests --- metloom/pointdata/nws_forecast.py | 6 +- metloom/variables.py | 8 +- tests/data/nws_mocks/initial_meta.json | 1 + tests/data/nws_mocks/meta_and_data.json | 23 ++++++ tests/test_nws.py | 98 +++++++++++++++++++++++++ 5 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 tests/data/nws_mocks/initial_meta.json create mode 100644 tests/data/nws_mocks/meta_and_data.json create mode 100644 tests/test_nws.py diff --git a/metloom/pointdata/nws_forecast.py b/metloom/pointdata/nws_forecast.py index c29bc41..af015fd 100644 --- a/metloom/pointdata/nws_forecast.py +++ b/metloom/pointdata/nws_forecast.py @@ -43,7 +43,7 @@ class NWSForecastPointData(PointData): """ DATASOURCE = "NWS Forecast" ALLOWED_VARIABLES = NWSForecastVariables - URL = "https://api.weather.gov/" + URL = "https://api.weather.gov" POINTS_FROM_GEOM_DEFAULTS = { 'within_geometry': True, 'token_json': "~/.frost_token.json", @@ -125,6 +125,7 @@ def _get_metadata(self): def _get_observations(self): """ Get the hourly data for a 7 day forecast + Example request: https://api.weather.gov/gridpoints/BOI/28,28 """ # ensure we have office, gridx, and gridy set if self._metadata is None: @@ -181,9 +182,6 @@ def _sensor_response_to_df( df = df.set_index("datetime") # resample to the desired duration - # TODO: Issue - # gridded data is not consistent with duration - # hourly data does not have precip mass if resample_duration is not None: df = resample_whole_df( df, sensor, diff --git a/metloom/variables.py b/metloom/variables.py index f5b43b1..c5aeca6 100644 --- a/metloom/variables.py +++ b/metloom/variables.py @@ -358,10 +358,10 @@ class NWSForecastVariables(VariableBase): "quantitativePrecipitation", "ACCUMULATED PRECIPITATION", accumulated=True ) - PRECIPITATION = SensorDescription( - "quantitativePrecipitation", "PRECIPITATION", - accumulated=False - ) + # PRECIPITATION = SensorDescription( + # "quantitativePrecipitation", "PRECIPITATION", + # accumulated=False + # ) TEMP = SensorDescription( "temperature", "AIR TEMP", ) diff --git a/tests/data/nws_mocks/initial_meta.json b/tests/data/nws_mocks/initial_meta.json new file mode 100644 index 0000000..47931c2 --- /dev/null +++ b/tests/data/nws_mocks/initial_meta.json @@ -0,0 +1 @@ +{"id": "https://api.weather.gov/points/43,-119", "type": "Feature", "geometry": {"type": "Point", "coordinates": [-119, 43]}, "properties": {"@id": "https://api.weather.gov/points/43,-119", "@type": "wx:Point", "cwa": "BOI", "forecastOffice": "https://api.weather.gov/offices/BOI", "gridId": "BOI", "gridX": 36, "gridY": 73, "forecast": "https://api.weather.gov/gridpoints/BOI/36,73/forecast", "forecastHourly": "https://api.weather.gov/gridpoints/BOI/36,73/forecast/hourly", "forecastGridData": "https://api.weather.gov/gridpoints/BOI/36,73", "observationStations": "https://api.weather.gov/gridpoints/BOI/36,73/stations", "relativeLocation": {"type": "Feature", "geometry": {"type": "Point", "coordinates": [-118.587477, 43.417916]}, "properties": {"city": "Crane", "state": "OR", "distance": {"unitCode": "wmoUnit:m", "value": 57247.208945802}, "bearing": {"unitCode": "wmoUnit:degree_(angle)", "value": 215}}}, "forecastZone": "https://api.weather.gov/zones/forecast/ORZ061", "county": "https://api.weather.gov/zones/county/ORC025", "fireWeatherZone": "https://api.weather.gov/zones/fire/ORZ636", "timeZone": "America/Los_Angeles", "radarStation": "KCBX"}} diff --git a/tests/data/nws_mocks/meta_and_data.json b/tests/data/nws_mocks/meta_and_data.json new file mode 100644 index 0000000..b87bcc8 --- /dev/null +++ b/tests/data/nws_mocks/meta_and_data.json @@ -0,0 +1,23 @@ +{ + "id": "https://api.weather.gov/gridpoints/BOI/36,73", + "type": "Feature", + "geometry": { + "type": "Polygon", "coordinates": + [[[-119.0106299, 43.0016632], [-119.0054146, 42.980347], [-118.9762914, 42.984157], [-118.98150059999999, 43.0054735], [-119.0106299, 43.0016632]]]}, + "properties": { + "updateTime": "2024-06-25T21:10:49+00:00", "validTimes": "2024-06-25T15:00:00+00:00/P7DT10H", + "elevation": {"unitCode": "wmoUnit:m", "value": 1524}, + "forecastOffice": "https://api.weather.gov/offices/BOI", + "gridId": "BOI", "gridX": "36", "gridY": "73", + "temperature": { + "uom": "wmoUnit:degC", + "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-06-25T16:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-25T17:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-06-25T18:00:00+00:00/PT1H", "value": 27.77777777777778}, {"validTime": "2024-06-25T19:00:00+00:00/PT1H", "value": 28.88888888888889}, {"validTime": "2024-06-25T20:00:00+00:00/PT1H", "value": 30.555555555555557}, {"validTime": "2024-06-25T21:00:00+00:00/PT2H", "value": 31.11111111111111}, {"validTime": "2024-06-25T23:00:00+00:00/PT2H", "value": 31.666666666666668}, {"validTime": "2024-06-26T01:00:00+00:00/PT1H", "value": 30}, {"validTime": "2024-06-26T02:00:00+00:00/PT1H", "value": 29.444444444444443}, {"validTime": "2024-06-26T03:00:00+00:00/PT1H", "value": 27.22222222222222}, {"validTime": "2024-06-26T04:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-26T05:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-06-26T06:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-06-26T07:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-06-26T08:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-26T09:00:00+00:00/PT1H", "value": 18.88888888888889}, {"validTime": "2024-06-26T10:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-26T11:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-06-26T12:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-26T13:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-06-26T14:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-26T15:00:00+00:00/PT1H", "value": 21.11111111111111}, {"validTime": "2024-06-26T16:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-26T17:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-06-26T18:00:00+00:00/PT1H", "value": 26.666666666666668}, {"validTime": "2024-06-26T19:00:00+00:00/PT1H", "value": 27.77777777777778}, {"validTime": "2024-06-26T20:00:00+00:00/PT1H", "value": 28.333333333333332}, {"validTime": "2024-06-26T21:00:00+00:00/PT1H", "value": 28.88888888888889}, {"validTime": "2024-06-26T22:00:00+00:00/PT1H", "value": 29.444444444444443}, {"validTime": "2024-06-26T23:00:00+00:00/PT2H", "value": 28.88888888888889}, {"validTime": "2024-06-27T01:00:00+00:00/PT1H", "value": 27.22222222222222}, {"validTime": "2024-06-27T02:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-06-27T03:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-27T04:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-27T05:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-06-27T06:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-06-27T07:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-06-27T08:00:00+00:00/PT1H", "value": 12.222222222222221}, {"validTime": "2024-06-27T09:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-06-27T10:00:00+00:00/PT1H", "value": 9.444444444444445}, {"validTime": "2024-06-27T11:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-27T12:00:00+00:00/PT1H", "value": 7.777777777777778}, {"validTime": "2024-06-27T13:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-27T14:00:00+00:00/PT1H", "value": 9.444444444444445}, {"validTime": "2024-06-27T15:00:00+00:00/PT1H", "value": 11.666666666666666}, {"validTime": "2024-06-27T16:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-06-27T17:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-27T18:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-27T19:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-27T20:00:00+00:00/PT1H", "value": 18.88888888888889}, {"validTime": "2024-06-27T21:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-27T22:00:00+00:00/PT3H", "value": 21.11111111111111}, {"validTime": "2024-06-28T01:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-06-28T02:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-28T03:00:00+00:00/PT1H", "value": 17.77777777777778}, {"validTime": "2024-06-28T04:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-28T05:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-28T06:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-06-28T07:00:00+00:00/PT1H", "value": 9.444444444444445}, {"validTime": "2024-06-28T08:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-28T09:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-06-28T10:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-06-28T11:00:00+00:00/PT2H", "value": 3.888888888888889}, {"validTime": "2024-06-28T13:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-06-28T14:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-28T15:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-06-28T16:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-06-28T17:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-06-28T18:00:00+00:00/PT1H", "value": 17.77777777777778}, {"validTime": "2024-06-28T19:00:00+00:00/PT1H", "value": 18.88888888888889}, {"validTime": "2024-06-28T20:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-06-28T21:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-06-28T22:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-28T23:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-06-29T00:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-06-29T01:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-29T02:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-29T03:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-06-29T04:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-29T05:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-29T06:00:00+00:00/PT1H", "value": 14.444444444444445}, {"validTime": "2024-06-29T07:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-29T08:00:00+00:00/PT1H", "value": 12.222222222222221}, {"validTime": "2024-06-29T09:00:00+00:00/PT1H", "value": 11.666666666666666}, {"validTime": "2024-06-29T10:00:00+00:00/PT1H", "value": 10}, {"validTime": "2024-06-29T11:00:00+00:00/PT2H", "value": 8.88888888888889}, {"validTime": "2024-06-29T13:00:00+00:00/PT1H", "value": 10.555555555555555}, {"validTime": "2024-06-29T14:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-06-29T15:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-06-29T16:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-29T17:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-06-29T18:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-29T19:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-06-29T20:00:00+00:00/PT1H", "value": 27.22222222222222}, {"validTime": "2024-06-29T21:00:00+00:00/PT1H", "value": 28.333333333333332}, {"validTime": "2024-06-29T22:00:00+00:00/PT1H", "value": 28.88888888888889}, {"validTime": "2024-06-29T23:00:00+00:00/PT1H", "value": 28.333333333333332}, {"validTime": "2024-06-30T00:00:00+00:00/PT1H", "value": 27.77777777777778}, {"validTime": "2024-06-30T01:00:00+00:00/PT1H", "value": 26.666666666666668}, {"validTime": "2024-06-30T02:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-30T03:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-06-30T04:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-06-30T05:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-30T06:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-30T07:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-30T08:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-06-30T09:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-30T10:00:00+00:00/PT1H", "value": 11.666666666666666}, {"validTime": "2024-06-30T11:00:00+00:00/PT2H", "value": 10}, {"validTime": "2024-06-30T13:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-06-30T14:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-06-30T15:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-06-30T16:00:00+00:00/PT1H", "value": 17.77777777777778}, {"validTime": "2024-06-30T17:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-30T18:00:00+00:00/PT1H", "value": 21.11111111111111}, {"validTime": "2024-06-30T19:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-06-30T20:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-06-30T21:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-30T22:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-06-30T23:00:00+00:00/PT2H", "value": 24.444444444444443}, {"validTime": "2024-07-01T01:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-07-01T02:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-07-01T03:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-07-01T04:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-07-01T05:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-07-01T06:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-07-01T07:00:00+00:00/PT1H", "value": 12.222222222222221}, {"validTime": "2024-07-01T08:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-07-01T09:00:00+00:00/PT1H", "value": 10}, {"validTime": "2024-07-01T10:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-07-01T11:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-07-01T12:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-07-01T13:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-07-01T14:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-07-01T15:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-07-01T16:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-07-01T17:00:00+00:00/PT1H", "value": 17.77777777777778}, {"validTime": "2024-07-01T18:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-07-01T19:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-07-01T20:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-07-01T21:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-07-01T22:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-07-01T23:00:00+00:00/PT2H", "value": 24.444444444444443}, {"validTime": "2024-07-02T01:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-07-02T02:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-07-02T03:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-07-02T04:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-07-02T05:00:00+00:00/PT1H", "value": 14.444444444444445}, {"validTime": "2024-07-02T06:00:00+00:00/PT1H", "value": 12.222222222222221}, {"validTime": "2024-07-02T07:00:00+00:00/PT1H", "value": 10.555555555555555}, {"validTime": "2024-07-02T08:00:00+00:00/PT1H", "value": 9.444444444444445}, {"validTime": "2024-07-02T09:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-07-02T10:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-07-02T11:00:00+00:00/PT2H", "value": 5}, {"validTime": "2024-07-02T13:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-07-02T14:00:00+00:00/PT1H", "value": 10}, {"validTime": "2024-07-02T15:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-07-02T16:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-07-02T17:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-07-02T18:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-07-02T19:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-07-02T20:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-07-02T21:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-07-02T22:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-07-02T23:00:00+00:00/PT1H", "value": 26.666666666666668}, {"validTime": "2024-07-03T00:00:00+00:00/PT1H", "value": 27.22222222222222}]}, + "dewpoint": {"uom": "wmoUnit:degC", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT1H", "value": 2.2222222222222223}, {"validTime": "2024-06-25T16:00:00+00:00/PT1H", "value": 1.6666666666666667}, {"validTime": "2024-06-25T17:00:00+00:00/PT1H", "value": 1.1111111111111112}, {"validTime": "2024-06-25T18:00:00+00:00/PT1H", "value": 0.5555555555555556}, {"validTime": "2024-06-25T19:00:00+00:00/PT1H", "value": 0}, {"validTime": "2024-06-25T20:00:00+00:00/PT1H", "value": -1.1111111111111112}, {"validTime": "2024-06-25T21:00:00+00:00/PT1H", "value": -2.2222222222222223}, {"validTime": "2024-06-25T22:00:00+00:00/PT2H", "value": -2.7777777777777777}, {"validTime": "2024-06-26T00:00:00+00:00/PT1H", "value": -2.2222222222222223}, {"validTime": "2024-06-26T01:00:00+00:00/PT1H", "value": -1.6666666666666667}, {"validTime": "2024-06-26T02:00:00+00:00/PT2H", "value": 0}, {"validTime": "2024-06-26T04:00:00+00:00/PT2H", "value": 0.5555555555555556}, {"validTime": "2024-06-26T06:00:00+00:00/PT4H", "value": 1.6666666666666667}, {"validTime": "2024-06-26T10:00:00+00:00/PT1H", "value": 2.7777777777777777}, {"validTime": "2024-06-26T11:00:00+00:00/PT1H", "value": 2.2222222222222223}, {"validTime": "2024-06-26T12:00:00+00:00/PT2H", "value": 3.3333333333333335}, {"validTime": "2024-06-26T14:00:00+00:00/PT1H", "value": 4.444444444444445}, {"validTime": "2024-06-26T15:00:00+00:00/PT1H", "value": 5}, {"validTime": "2024-06-26T16:00:00+00:00/PT2H", "value": 4.444444444444445}, {"validTime": "2024-06-26T18:00:00+00:00/PT1H", "value": 3.888888888888889}, {"validTime": "2024-06-26T19:00:00+00:00/PT1H", "value": 3.3333333333333335}, {"validTime": "2024-06-26T20:00:00+00:00/PT1H", "value": 2.2222222222222223}, {"validTime": "2024-06-26T21:00:00+00:00/PT1H", "value": 0.5555555555555556}, {"validTime": "2024-06-26T22:00:00+00:00/PT1H", "value": 0}, {"validTime": "2024-06-26T23:00:00+00:00/PT1H", "value": -1.1111111111111112}, {"validTime": "2024-06-27T00:00:00+00:00/PT1H", "value": -2.2222222222222223}, {"validTime": "2024-06-27T01:00:00+00:00/PT1H", "value": -1.6666666666666667}, {"validTime": "2024-06-27T02:00:00+00:00/PT1H", "value": -1.1111111111111112}, {"validTime": "2024-06-27T03:00:00+00:00/PT1H", "value": -1.6666666666666667}, {"validTime": "2024-06-27T04:00:00+00:00/PT1H", "value": -1.1111111111111112}, {"validTime": "2024-06-27T05:00:00+00:00/PT1H", "value": -0.5555555555555556}, {"validTime": "2024-06-27T06:00:00+00:00/PT1H", "value": 0}, {"validTime": "2024-06-27T07:00:00+00:00/PT3H", "value": 0.5555555555555556}, {"validTime": "2024-06-27T10:00:00+00:00/PT3H", "value": 1.1111111111111112}, {"validTime": "2024-06-27T13:00:00+00:00/PT1H", "value": 1.6666666666666667}, {"validTime": "2024-06-27T14:00:00+00:00/PT1H", "value": 2.2222222222222223}, {"validTime": "2024-06-27T15:00:00+00:00/PT1H", "value": 2.7777777777777777}, {"validTime": "2024-06-27T16:00:00+00:00/PT1H", "value": 2.2222222222222223}, {"validTime": "2024-06-27T17:00:00+00:00/PT1H", "value": 1.6666666666666667}, {"validTime": "2024-06-27T18:00:00+00:00/PT1H", "value": 0.5555555555555556}, {"validTime": "2024-06-27T19:00:00+00:00/PT1H", "value": 0}, {"validTime": "2024-06-27T20:00:00+00:00/PT1H", "value": -0.5555555555555556}, {"validTime": "2024-06-27T21:00:00+00:00/PT1H", "value": -1.1111111111111112}, {"validTime": "2024-06-27T22:00:00+00:00/PT1H", "value": -1.6666666666666667}, {"validTime": "2024-06-27T23:00:00+00:00/PT3H", "value": -2.2222222222222223}, {"validTime": "2024-06-28T02:00:00+00:00/PT1H", "value": -1.6666666666666667}, {"validTime": "2024-06-28T03:00:00+00:00/PT1H", "value": -1.1111111111111112}, {"validTime": "2024-06-28T04:00:00+00:00/PT9H", "value": -0.5555555555555556}, {"validTime": "2024-06-28T13:00:00+00:00/PT1H", "value": 0.5555555555555556}, {"validTime": "2024-06-28T14:00:00+00:00/PT1H", "value": 1.1111111111111112}, {"validTime": "2024-06-28T15:00:00+00:00/PT2H", "value": 2.2222222222222223}, {"validTime": "2024-06-28T17:00:00+00:00/PT1H", "value": 1.6666666666666667}, {"validTime": "2024-06-28T18:00:00+00:00/PT1H", "value": 1.1111111111111112}, {"validTime": "2024-06-28T19:00:00+00:00/PT1H", "value": 0}, {"validTime": "2024-06-28T20:00:00+00:00/PT1H", "value": -0.5555555555555556}, {"validTime": "2024-06-28T21:00:00+00:00/PT1H", "value": -1.1111111111111112}, {"validTime": "2024-06-28T22:00:00+00:00/PT1H", "value": -1.6666666666666667}, {"validTime": "2024-06-28T23:00:00+00:00/PT1H", "value": -2.2222222222222223}, {"validTime": "2024-06-29T00:00:00+00:00/PT1H", "value": -1.1111111111111112}, {"validTime": "2024-06-29T01:00:00+00:00/PT2H", "value": -1.6666666666666667}, {"validTime": "2024-06-29T03:00:00+00:00/PT4H", "value": -1.1111111111111112}, {"validTime": "2024-06-29T07:00:00+00:00/PT3H", "value": -1.6666666666666667}, {"validTime": "2024-06-29T10:00:00+00:00/PT2H", "value": -2.2222222222222223}, {"validTime": "2024-06-29T12:00:00+00:00/PT1H", "value": -1.6666666666666667}, {"validTime": "2024-06-29T13:00:00+00:00/PT1H", "value": -0.5555555555555556}, {"validTime": "2024-06-29T14:00:00+00:00/PT1H", "value": 0.5555555555555556}, {"validTime": "2024-06-29T15:00:00+00:00/PT3H", "value": 1.6666666666666667}, {"validTime": "2024-06-29T18:00:00+00:00/PT1H", "value": 1.1111111111111112}, {"validTime": "2024-06-29T19:00:00+00:00/PT1H", "value": 0.5555555555555556}, {"validTime": "2024-06-29T20:00:00+00:00/PT4H", "value": 1.1111111111111112}, {"validTime": "2024-06-30T00:00:00+00:00/PT1H", "value": 1.6666666666666667}, {"validTime": "2024-06-30T01:00:00+00:00/PT1H", "value": 2.2222222222222223}, {"validTime": "2024-06-30T02:00:00+00:00/PT1H", "value": 2.7777777777777777}, {"validTime": "2024-06-30T03:00:00+00:00/PT2H", "value": 3.3333333333333335}, {"validTime": "2024-06-30T05:00:00+00:00/PT3H", "value": 3.888888888888889}, {"validTime": "2024-06-30T08:00:00+00:00/PT4H", "value": 4.444444444444445}, {"validTime": "2024-06-30T12:00:00+00:00/PT1H", "value": 5}, {"validTime": "2024-06-30T13:00:00+00:00/PT1H", "value": 6.111111111111111}, {"validTime": "2024-06-30T14:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-06-30T15:00:00+00:00/PT1H", "value": 7.777777777777778}, {"validTime": "2024-06-30T16:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-06-30T17:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-06-30T18:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-06-30T19:00:00+00:00/PT2H", "value": 5}, {"validTime": "2024-06-30T21:00:00+00:00/PT1H", "value": 4.444444444444445}, {"validTime": "2024-06-30T22:00:00+00:00/PT1H", "value": 3.888888888888889}, {"validTime": "2024-06-30T23:00:00+00:00/PT1H", "value": 3.3333333333333335}, {"validTime": "2024-07-01T00:00:00+00:00/PT1H", "value": 2.7777777777777777}, {"validTime": "2024-07-01T01:00:00+00:00/PT4H", "value": 2.2222222222222223}, {"validTime": "2024-07-01T05:00:00+00:00/PT1H", "value": 2.7777777777777777}, {"validTime": "2024-07-01T06:00:00+00:00/PT3H", "value": 2.2222222222222223}, {"validTime": "2024-07-01T09:00:00+00:00/PT3H", "value": 1.6666666666666667}, {"validTime": "2024-07-01T12:00:00+00:00/PT1H", "value": 2.2222222222222223}, {"validTime": "2024-07-01T13:00:00+00:00/PT1H", "value": 3.3333333333333335}, {"validTime": "2024-07-01T14:00:00+00:00/PT1H", "value": 4.444444444444445}, {"validTime": "2024-07-01T15:00:00+00:00/PT2H", "value": 5}, {"validTime": "2024-07-01T17:00:00+00:00/PT1H", "value": 3.888888888888889}, {"validTime": "2024-07-01T18:00:00+00:00/PT1H", "value": 2.2222222222222223}, {"validTime": "2024-07-01T19:00:00+00:00/PT1H", "value": 1.6666666666666667}, {"validTime": "2024-07-01T20:00:00+00:00/PT1H", "value": 0.5555555555555556}, {"validTime": "2024-07-01T21:00:00+00:00/PT1H", "value": 0}, {"validTime": "2024-07-01T22:00:00+00:00/PT1H", "value": -1.1111111111111112}, {"validTime": "2024-07-01T23:00:00+00:00/PT1H", "value": -2.2222222222222223}, {"validTime": "2024-07-02T00:00:00+00:00/PT3H", "value": -2.7777777777777777}, {"validTime": "2024-07-02T03:00:00+00:00/PT1H", "value": -2.2222222222222223}, {"validTime": "2024-07-02T04:00:00+00:00/PT8H", "value": -1.1111111111111112}, {"validTime": "2024-07-02T12:00:00+00:00/PT1H", "value": -0.5555555555555556}, {"validTime": "2024-07-02T13:00:00+00:00/PT1H", "value": 0.5555555555555556}, {"validTime": "2024-07-02T14:00:00+00:00/PT1H", "value": 1.6666666666666667}, {"validTime": "2024-07-02T15:00:00+00:00/PT2H", "value": 2.2222222222222223}, {"validTime": "2024-07-02T17:00:00+00:00/PT1H", "value": 1.1111111111111112}, {"validTime": "2024-07-02T18:00:00+00:00/PT1H", "value": 0}, {"validTime": "2024-07-02T19:00:00+00:00/PT1H", "value": -1.1111111111111112}, {"validTime": "2024-07-02T20:00:00+00:00/PT1H", "value": -1.6666666666666667}, {"validTime": "2024-07-02T21:00:00+00:00/PT1H", "value": -2.2222222222222223}, {"validTime": "2024-07-02T22:00:00+00:00/PT1H", "value": -3.3333333333333335}, {"validTime": "2024-07-02T23:00:00+00:00/PT1H", "value": -4.444444444444445}, {"validTime": "2024-07-03T00:00:00+00:00/PT1H", "value": -5}]}, + "maxTemperature": {"uom": "wmoUnit:degC", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT12H", "value": 32.22222222222222}, {"validTime": "2024-06-26T14:00:00+00:00/PT13H", "value": 29.444444444444443}, {"validTime": "2024-06-27T14:00:00+00:00/PT13H", "value": 21.666666666666668}, {"validTime": "2024-06-28T14:00:00+00:00/PT13H", "value": 24.444444444444443}, {"validTime": "2024-06-29T14:00:00+00:00/PT13H", "value": 28.88888888888889}, {"validTime": "2024-06-30T14:00:00+00:00/PT13H", "value": 25.555555555555557}, {"validTime": "2024-07-01T14:00:00+00:00/PT13H", "value": 24.444444444444443}, {"validTime": "2024-07-02T14:00:00+00:00/PT13H", "value": 27.22222222222222}]}, + "minTemperature": {"uom": "wmoUnit:degC", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT1H", "value": 10}, {"validTime": "2024-06-26T02:00:00+00:00/PT14H", "value": 14.444444444444445}, {"validTime": "2024-06-27T02:00:00+00:00/PT14H", "value": 6.666666666666667}, {"validTime": "2024-06-28T02:00:00+00:00/PT14H", "value": 3.3333333333333335}, {"validTime": "2024-06-29T02:00:00+00:00/PT14H", "value": 8.333333333333334}, {"validTime": "2024-06-30T02:00:00+00:00/PT14H", "value": 9.444444444444445}, {"validTime": "2024-07-01T02:00:00+00:00/PT14H", "value": 6.666666666666667}, {"validTime": "2024-07-02T02:00:00+00:00/PT14H", "value": 4.444444444444445}, {"validTime": "2024-07-03T02:00:00+00:00/PT14H", "value": 6.666666666666667}]}, + "relativeHumidity": {"uom": "wmoUnit:percent", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT1H", "value": 30}, {"validTime": "2024-06-25T16:00:00+00:00/PT1H", "value": 24}, {"validTime": "2024-06-25T17:00:00+00:00/PT1H", "value": 21}, {"validTime": "2024-06-25T18:00:00+00:00/PT1H", "value": 17}, {"validTime": "2024-06-25T19:00:00+00:00/PT1H", "value": 16}, {"validTime": "2024-06-25T20:00:00+00:00/PT1H", "value": 13}, {"validTime": "2024-06-25T21:00:00+00:00/PT1H", "value": 11}, {"validTime": "2024-06-25T22:00:00+00:00/PT1H", "value": 12}, {"validTime": "2024-06-25T23:00:00+00:00/PT2H", "value": 11}, {"validTime": "2024-06-26T01:00:00+00:00/PT1H", "value": 13}, {"validTime": "2024-06-26T02:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-26T03:00:00+00:00/PT1H", "value": 17}, {"validTime": "2024-06-26T04:00:00+00:00/PT1H", "value": 21}, {"validTime": "2024-06-26T05:00:00+00:00/PT1H", "value": 23}, {"validTime": "2024-06-26T06:00:00+00:00/PT1H", "value": 26}, {"validTime": "2024-06-26T07:00:00+00:00/PT1H", "value": 28}, {"validTime": "2024-06-26T08:00:00+00:00/PT1H", "value": 30}, {"validTime": "2024-06-26T09:00:00+00:00/PT1H", "value": 32}, {"validTime": "2024-06-26T10:00:00+00:00/PT1H", "value": 35}, {"validTime": "2024-06-26T11:00:00+00:00/PT1H", "value": 38}, {"validTime": "2024-06-26T12:00:00+00:00/PT1H", "value": 41}, {"validTime": "2024-06-26T13:00:00+00:00/PT1H", "value": 42}, {"validTime": "2024-06-26T14:00:00+00:00/PT1H", "value": 41}, {"validTime": "2024-06-26T15:00:00+00:00/PT1H", "value": 35}, {"validTime": "2024-06-26T16:00:00+00:00/PT1H", "value": 29}, {"validTime": "2024-06-26T17:00:00+00:00/PT1H", "value": 26}, {"validTime": "2024-06-26T18:00:00+00:00/PT1H", "value": 22}, {"validTime": "2024-06-26T19:00:00+00:00/PT1H", "value": 21}, {"validTime": "2024-06-26T20:00:00+00:00/PT1H", "value": 18}, {"validTime": "2024-06-26T21:00:00+00:00/PT1H", "value": 16}, {"validTime": "2024-06-26T22:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-26T23:00:00+00:00/PT1H", "value": 14}, {"validTime": "2024-06-27T00:00:00+00:00/PT1H", "value": 13}, {"validTime": "2024-06-27T01:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-27T02:00:00+00:00/PT1H", "value": 17}, {"validTime": "2024-06-27T03:00:00+00:00/PT1H", "value": 19}, {"validTime": "2024-06-27T04:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-06-27T05:00:00+00:00/PT1H", "value": 30}, {"validTime": "2024-06-27T06:00:00+00:00/PT1H", "value": 36}, {"validTime": "2024-06-27T07:00:00+00:00/PT1H", "value": 42}, {"validTime": "2024-06-27T08:00:00+00:00/PT1H", "value": 46}, {"validTime": "2024-06-27T09:00:00+00:00/PT1H", "value": 50}, {"validTime": "2024-06-27T10:00:00+00:00/PT1H", "value": 55}, {"validTime": "2024-06-27T11:00:00+00:00/PT1H", "value": 60}, {"validTime": "2024-06-27T12:00:00+00:00/PT2H", "value": 63}, {"validTime": "2024-06-27T14:00:00+00:00/PT1H", "value": 60}, {"validTime": "2024-06-27T15:00:00+00:00/PT1H", "value": 54}, {"validTime": "2024-06-27T16:00:00+00:00/PT1H", "value": 47}, {"validTime": "2024-06-27T17:00:00+00:00/PT1H", "value": 40}, {"validTime": "2024-06-27T18:00:00+00:00/PT1H", "value": 33}, {"validTime": "2024-06-27T19:00:00+00:00/PT1H", "value": 29}, {"validTime": "2024-06-27T20:00:00+00:00/PT1H", "value": 26}, {"validTime": "2024-06-27T21:00:00+00:00/PT1H", "value": 24}, {"validTime": "2024-06-27T22:00:00+00:00/PT1H", "value": 22}, {"validTime": "2024-06-27T23:00:00+00:00/PT1H", "value": 21}, {"validTime": "2024-06-28T00:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-28T01:00:00+00:00/PT1H", "value": 21}, {"validTime": "2024-06-28T02:00:00+00:00/PT1H", "value": 24}, {"validTime": "2024-06-28T03:00:00+00:00/PT1H", "value": 28}, {"validTime": "2024-06-28T04:00:00+00:00/PT1H", "value": 33}, {"validTime": "2024-06-28T05:00:00+00:00/PT1H", "value": 39}, {"validTime": "2024-06-28T06:00:00+00:00/PT1H", "value": 45}, {"validTime": "2024-06-28T07:00:00+00:00/PT1H", "value": 49}, {"validTime": "2024-06-28T08:00:00+00:00/PT1H", "value": 53}, {"validTime": "2024-06-28T09:00:00+00:00/PT1H", "value": 59}, {"validTime": "2024-06-28T10:00:00+00:00/PT1H", "value": 65}, {"validTime": "2024-06-28T11:00:00+00:00/PT1H", "value": 71}, {"validTime": "2024-06-28T12:00:00+00:00/PT1H", "value": 74}, {"validTime": "2024-06-28T13:00:00+00:00/PT1H", "value": 70}, {"validTime": "2024-06-28T14:00:00+00:00/PT1H", "value": 62}, {"validTime": "2024-06-28T15:00:00+00:00/PT1H", "value": 53}, {"validTime": "2024-06-28T16:00:00+00:00/PT1H", "value": 45}, {"validTime": "2024-06-28T17:00:00+00:00/PT1H", "value": 38}, {"validTime": "2024-06-28T18:00:00+00:00/PT1H", "value": 33}, {"validTime": "2024-06-28T19:00:00+00:00/PT1H", "value": 28}, {"validTime": "2024-06-28T20:00:00+00:00/PT1H", "value": 24}, {"validTime": "2024-06-28T21:00:00+00:00/PT1H", "value": 21}, {"validTime": "2024-06-28T22:00:00+00:00/PT1H", "value": 19}, {"validTime": "2024-06-28T23:00:00+00:00/PT1H", "value": 17}, {"validTime": "2024-06-29T00:00:00+00:00/PT2H", "value": 18}, {"validTime": "2024-06-29T02:00:00+00:00/PT1H", "value": 19}, {"validTime": "2024-06-29T03:00:00+00:00/PT1H", "value": 22}, {"validTime": "2024-06-29T04:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-06-29T05:00:00+00:00/PT1H", "value": 30}, {"validTime": "2024-06-29T06:00:00+00:00/PT1H", "value": 34}, {"validTime": "2024-06-29T07:00:00+00:00/PT1H", "value": 36}, {"validTime": "2024-06-29T08:00:00+00:00/PT1H", "value": 38}, {"validTime": "2024-06-29T09:00:00+00:00/PT1H", "value": 39}, {"validTime": "2024-06-29T10:00:00+00:00/PT1H", "value": 43}, {"validTime": "2024-06-29T11:00:00+00:00/PT1H", "value": 47}, {"validTime": "2024-06-29T12:00:00+00:00/PT1H", "value": 48}, {"validTime": "2024-06-29T13:00:00+00:00/PT1H", "value": 46}, {"validTime": "2024-06-29T14:00:00+00:00/PT1H", "value": 41}, {"validTime": "2024-06-29T15:00:00+00:00/PT1H", "value": 36}, {"validTime": "2024-06-29T16:00:00+00:00/PT1H", "value": 30}, {"validTime": "2024-06-29T17:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-06-29T18:00:00+00:00/PT1H", "value": 21}, {"validTime": "2024-06-29T19:00:00+00:00/PT1H", "value": 19}, {"validTime": "2024-06-29T20:00:00+00:00/PT2H", "value": 18}, {"validTime": "2024-06-29T22:00:00+00:00/PT2H", "value": 17}, {"validTime": "2024-06-30T00:00:00+00:00/PT1H", "value": 18}, {"validTime": "2024-06-30T01:00:00+00:00/PT1H", "value": 21}, {"validTime": "2024-06-30T02:00:00+00:00/PT1H", "value": 24}, {"validTime": "2024-06-30T03:00:00+00:00/PT1H", "value": 28}, {"validTime": "2024-06-30T04:00:00+00:00/PT1H", "value": 33}, {"validTime": "2024-06-30T05:00:00+00:00/PT1H", "value": 38}, {"validTime": "2024-06-30T06:00:00+00:00/PT1H", "value": 44}, {"validTime": "2024-06-30T07:00:00+00:00/PT1H", "value": 48}, {"validTime": "2024-06-30T08:00:00+00:00/PT1H", "value": 52}, {"validTime": "2024-06-30T09:00:00+00:00/PT1H", "value": 57}, {"validTime": "2024-06-30T10:00:00+00:00/PT1H", "value": 63}, {"validTime": "2024-06-30T11:00:00+00:00/PT1H", "value": 68}, {"validTime": "2024-06-30T12:00:00+00:00/PT1H", "value": 71}, {"validTime": "2024-06-30T13:00:00+00:00/PT1H", "value": 70}, {"validTime": "2024-06-30T14:00:00+00:00/PT1H", "value": 65}, {"validTime": "2024-06-30T15:00:00+00:00/PT1H", "value": 59}, {"validTime": "2024-06-30T16:00:00+00:00/PT1H", "value": 51}, {"validTime": "2024-06-30T17:00:00+00:00/PT1H", "value": 44}, {"validTime": "2024-06-30T18:00:00+00:00/PT1H", "value": 37}, {"validTime": "2024-06-30T19:00:00+00:00/PT1H", "value": 33}, {"validTime": "2024-06-30T20:00:00+00:00/PT1H", "value": 31}, {"validTime": "2024-06-30T21:00:00+00:00/PT1H", "value": 29}, {"validTime": "2024-06-30T22:00:00+00:00/PT1H", "value": 27}, {"validTime": "2024-06-30T23:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-07-01T00:00:00+00:00/PT1H", "value": 24}, {"validTime": "2024-07-01T01:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-07-01T02:00:00+00:00/PT1H", "value": 26}, {"validTime": "2024-07-01T03:00:00+00:00/PT1H", "value": 29}, {"validTime": "2024-07-01T04:00:00+00:00/PT1H", "value": 34}, {"validTime": "2024-07-01T05:00:00+00:00/PT1H", "value": 40}, {"validTime": "2024-07-01T06:00:00+00:00/PT1H", "value": 46}, {"validTime": "2024-07-01T07:00:00+00:00/PT1H", "value": 50}, {"validTime": "2024-07-01T08:00:00+00:00/PT1H", "value": 53}, {"validTime": "2024-07-01T09:00:00+00:00/PT1H", "value": 57}, {"validTime": "2024-07-01T10:00:00+00:00/PT1H", "value": 63}, {"validTime": "2024-07-01T11:00:00+00:00/PT1H", "value": 69}, {"validTime": "2024-07-01T12:00:00+00:00/PT1H", "value": 72}, {"validTime": "2024-07-01T13:00:00+00:00/PT1H", "value": 69}, {"validTime": "2024-07-01T14:00:00+00:00/PT1H", "value": 64}, {"validTime": "2024-07-01T15:00:00+00:00/PT1H", "value": 56}, {"validTime": "2024-07-01T16:00:00+00:00/PT1H", "value": 48}, {"validTime": "2024-07-01T17:00:00+00:00/PT1H", "value": 40}, {"validTime": "2024-07-01T18:00:00+00:00/PT1H", "value": 33}, {"validTime": "2024-07-01T19:00:00+00:00/PT1H", "value": 28}, {"validTime": "2024-07-01T20:00:00+00:00/PT1H", "value": 24}, {"validTime": "2024-07-01T21:00:00+00:00/PT1H", "value": 22}, {"validTime": "2024-07-01T22:00:00+00:00/PT1H", "value": 19}, {"validTime": "2024-07-01T23:00:00+00:00/PT1H", "value": 17}, {"validTime": "2024-07-02T00:00:00+00:00/PT1H", "value": 16}, {"validTime": "2024-07-02T01:00:00+00:00/PT1H", "value": 17}, {"validTime": "2024-07-02T02:00:00+00:00/PT1H", "value": 19}, {"validTime": "2024-07-02T03:00:00+00:00/PT1H", "value": 23}, {"validTime": "2024-07-02T04:00:00+00:00/PT1H", "value": 28}, {"validTime": "2024-07-02T05:00:00+00:00/PT1H", "value": 34}, {"validTime": "2024-07-02T06:00:00+00:00/PT1H", "value": 40}, {"validTime": "2024-07-02T07:00:00+00:00/PT1H", "value": 44}, {"validTime": "2024-07-02T08:00:00+00:00/PT1H", "value": 48}, {"validTime": "2024-07-02T09:00:00+00:00/PT1H", "value": 52}, {"validTime": "2024-07-02T10:00:00+00:00/PT1H", "value": 59}, {"validTime": "2024-07-02T11:00:00+00:00/PT1H", "value": 64}, {"validTime": "2024-07-02T12:00:00+00:00/PT1H", "value": 66}, {"validTime": "2024-07-02T13:00:00+00:00/PT1H", "value": 62}, {"validTime": "2024-07-02T14:00:00+00:00/PT1H", "value": 55}, {"validTime": "2024-07-02T15:00:00+00:00/PT1H", "value": 46}, {"validTime": "2024-07-02T16:00:00+00:00/PT1H", "value": 39}, {"validTime": "2024-07-02T17:00:00+00:00/PT1H", "value": 32}, {"validTime": "2024-07-02T18:00:00+00:00/PT1H", "value": 26}, {"validTime": "2024-07-02T19:00:00+00:00/PT1H", "value": 21}, {"validTime": "2024-07-02T20:00:00+00:00/PT1H", "value": 18}, {"validTime": "2024-07-02T21:00:00+00:00/PT1H", "value": 16}, {"validTime": "2024-07-02T22:00:00+00:00/PT1H", "value": 14}, {"validTime": "2024-07-02T23:00:00+00:00/PT1H", "value": 13}, {"validTime": "2024-07-03T00:00:00+00:00/PT1H", "value": 12}]}, "apparentTemperature": {"uom": "wmoUnit:degC", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-06-25T16:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-25T17:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-06-25T18:00:00+00:00/PT1H", "value": 26.666666666666668}, {"validTime": "2024-06-25T19:00:00+00:00/PT1H", "value": 27.22222222222222}, {"validTime": "2024-06-25T20:00:00+00:00/PT1H", "value": 28.333333333333332}, {"validTime": "2024-06-25T21:00:00+00:00/PT1H", "value": 28.88888888888889}, {"validTime": "2024-06-25T22:00:00+00:00/PT3H", "value": 29.444444444444443}, {"validTime": "2024-06-26T01:00:00+00:00/PT1H", "value": 28.333333333333332}, {"validTime": "2024-06-26T02:00:00+00:00/PT1H", "value": 27.77777777777778}, {"validTime": "2024-06-26T03:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-06-26T04:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-26T05:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-06-26T06:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-06-26T07:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-06-26T08:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-26T09:00:00+00:00/PT1H", "value": 18.88888888888889}, {"validTime": "2024-06-26T10:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-26T11:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-06-26T12:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-26T13:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-06-26T14:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-26T15:00:00+00:00/PT1H", "value": 21.11111111111111}, {"validTime": "2024-06-26T16:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-26T17:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-06-26T18:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-06-26T19:00:00+00:00/PT1H", "value": 26.666666666666668}, {"validTime": "2024-06-26T20:00:00+00:00/PT2H", "value": 27.22222222222222}, {"validTime": "2024-06-26T22:00:00+00:00/PT1H", "value": 27.77777777777778}, {"validTime": "2024-06-26T23:00:00+00:00/PT2H", "value": 27.22222222222222}, {"validTime": "2024-06-27T01:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-06-27T02:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-06-27T03:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-27T04:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-27T05:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-06-27T06:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-06-27T07:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-06-27T08:00:00+00:00/PT1H", "value": 12.222222222222221}, {"validTime": "2024-06-27T09:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-06-27T10:00:00+00:00/PT1H", "value": 7.777777777777778}, {"validTime": "2024-06-27T11:00:00+00:00/PT2H", "value": 6.111111111111111}, {"validTime": "2024-06-27T13:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-06-27T14:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-27T15:00:00+00:00/PT1H", "value": 11.666666666666666}, {"validTime": "2024-06-27T16:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-06-27T17:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-27T18:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-27T19:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-27T20:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-27T21:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-27T22:00:00+00:00/PT3H", "value": 21.11111111111111}, {"validTime": "2024-06-28T01:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-06-28T02:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-28T03:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-06-28T04:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-28T05:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-28T06:00:00+00:00/PT1H", "value": 10.555555555555555}, {"validTime": "2024-06-28T07:00:00+00:00/PT1H", "value": 7.777777777777778}, {"validTime": "2024-06-28T08:00:00+00:00/PT2H", "value": 6.111111111111111}, {"validTime": "2024-06-28T10:00:00+00:00/PT1H", "value": 4.444444444444445}, {"validTime": "2024-06-28T11:00:00+00:00/PT1H", "value": 2.7777777777777777}, {"validTime": "2024-06-28T12:00:00+00:00/PT1H", "value": 3.888888888888889}, {"validTime": "2024-06-28T13:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-06-28T14:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-28T15:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-06-28T16:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-06-28T17:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-06-28T18:00:00+00:00/PT1H", "value": 17.77777777777778}, {"validTime": "2024-06-28T19:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-28T20:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-06-28T21:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-06-28T22:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-06-28T23:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-06-29T00:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-06-29T01:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-29T02:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-29T03:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-06-29T04:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-29T05:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-29T06:00:00+00:00/PT1H", "value": 14.444444444444445}, {"validTime": "2024-06-29T07:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-29T08:00:00+00:00/PT1H", "value": 12.222222222222221}, {"validTime": "2024-06-29T09:00:00+00:00/PT1H", "value": 11.666666666666666}, {"validTime": "2024-06-29T10:00:00+00:00/PT1H", "value": 9.444444444444445}, {"validTime": "2024-06-29T11:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-29T12:00:00+00:00/PT1H", "value": 8.88888888888889}, {"validTime": "2024-06-29T13:00:00+00:00/PT1H", "value": 10.555555555555555}, {"validTime": "2024-06-29T14:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-06-29T15:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-06-29T16:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-29T17:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-06-29T18:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-29T19:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-06-29T20:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-06-29T21:00:00+00:00/PT1H", "value": 26.666666666666668}, {"validTime": "2024-06-29T22:00:00+00:00/PT2H", "value": 27.22222222222222}, {"validTime": "2024-06-30T00:00:00+00:00/PT1H", "value": 26.666666666666668}, {"validTime": "2024-06-30T01:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-06-30T02:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-30T03:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-06-30T04:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-06-30T05:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-30T06:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-30T07:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-30T08:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-06-30T09:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-30T10:00:00+00:00/PT1H", "value": 11.666666666666666}, {"validTime": "2024-06-30T11:00:00+00:00/PT2H", "value": 8.88888888888889}, {"validTime": "2024-06-30T13:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-06-30T14:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-06-30T15:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-06-30T16:00:00+00:00/PT1H", "value": 17.77777777777778}, {"validTime": "2024-06-30T17:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-30T18:00:00+00:00/PT1H", "value": 21.11111111111111}, {"validTime": "2024-06-30T19:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-06-30T20:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-06-30T21:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-30T22:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-06-30T23:00:00+00:00/PT2H", "value": 24.444444444444443}, {"validTime": "2024-07-01T01:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-07-01T02:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-07-01T03:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-07-01T04:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-07-01T05:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-07-01T06:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-07-01T07:00:00+00:00/PT1H", "value": 12.222222222222221}, {"validTime": "2024-07-01T08:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-07-01T09:00:00+00:00/PT1H", "value": 8.88888888888889}, {"validTime": "2024-07-01T10:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-07-01T11:00:00+00:00/PT1H", "value": 5}, {"validTime": "2024-07-01T12:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-07-01T13:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-07-01T14:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-07-01T15:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-07-01T16:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-07-01T17:00:00+00:00/PT1H", "value": 17.77777777777778}, {"validTime": "2024-07-01T18:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-07-01T19:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-07-01T20:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-07-01T21:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-07-01T22:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-07-01T23:00:00+00:00/PT2H", "value": 24.444444444444443}, {"validTime": "2024-07-02T01:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-07-02T02:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-07-02T03:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-07-02T04:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-07-02T05:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-07-02T06:00:00+00:00/PT1H", "value": 12.222222222222221}, {"validTime": "2024-07-02T07:00:00+00:00/PT1H", "value": 10.555555555555555}, {"validTime": "2024-07-02T08:00:00+00:00/PT2H", "value": 7.777777777777778}, {"validTime": "2024-07-02T10:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-07-02T11:00:00+00:00/PT1H", "value": 3.888888888888889}, {"validTime": "2024-07-02T12:00:00+00:00/PT1H", "value": 5}, {"validTime": "2024-07-02T13:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-07-02T14:00:00+00:00/PT1H", "value": 10}, {"validTime": "2024-07-02T15:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-07-02T16:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-07-02T17:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-07-02T18:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-07-02T19:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-07-02T20:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-07-02T21:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-07-02T22:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-07-02T23:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-07-03T00:00:00+00:00/PT1H", "value": 26.11111111111111}]}, "wetBulbGlobeTemperature": {"uom": "wmoUnit:degC", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-25T16:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-06-25T17:00:00+00:00/PT1H", "value": 18.88888888888889}, {"validTime": "2024-06-25T18:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-25T19:00:00+00:00/PT1H", "value": 21.11111111111111}, {"validTime": "2024-06-25T20:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-06-25T21:00:00+00:00/PT2H", "value": 21.666666666666668}, {"validTime": "2024-06-25T23:00:00+00:00/PT1H", "value": 21.11111111111111}, {"validTime": "2024-06-26T00:00:00+00:00/PT1H", "value": 20.555555555555557}, {"validTime": "2024-06-26T01:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-26T02:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-26T03:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-26T04:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-06-26T05:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-26T06:00:00+00:00/PT1H", "value": 14.444444444444445}, {"validTime": "2024-06-26T07:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-06-26T08:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-06-26T09:00:00+00:00/PT2H", "value": 12.777777777777779}, {"validTime": "2024-06-26T11:00:00+00:00/PT3H", "value": 11.666666666666666}, {"validTime": "2024-06-26T14:00:00+00:00/PT1H", "value": 13.333333333333334}, {"validTime": "2024-06-26T15:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-06-26T16:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-06-26T17:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-26T18:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-26T19:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-26T20:00:00+00:00/PT2H", "value": 20.555555555555557}, {"validTime": "2024-06-26T22:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-26T23:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-27T00:00:00+00:00/PT1H", "value": 18.88888888888889}, {"validTime": "2024-06-27T01:00:00+00:00/PT1H", "value": 17.77777777777778}, {"validTime": "2024-06-27T02:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-27T03:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-27T04:00:00+00:00/PT1H", "value": 12.222222222222221}, {"validTime": "2024-06-27T05:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-06-27T06:00:00+00:00/PT1H", "value": 10}, {"validTime": "2024-06-27T07:00:00+00:00/PT1H", "value": 8.88888888888889}, {"validTime": "2024-06-27T08:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-27T09:00:00+00:00/PT1H", "value": 7.777777777777778}, {"validTime": "2024-06-27T10:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-06-27T11:00:00+00:00/PT2H", "value": 5.555555555555555}, {"validTime": "2024-06-27T13:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-06-27T14:00:00+00:00/PT1H", "value": 7.777777777777778}, {"validTime": "2024-06-27T15:00:00+00:00/PT1H", "value": 8.88888888888889}, {"validTime": "2024-06-27T16:00:00+00:00/PT1H", "value": 10.555555555555555}, {"validTime": "2024-06-27T17:00:00+00:00/PT1H", "value": 11.666666666666666}, {"validTime": "2024-06-27T18:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-27T19:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-06-27T20:00:00+00:00/PT1H", "value": 14.444444444444445}, {"validTime": "2024-06-27T21:00:00+00:00/PT3H", "value": 15}, {"validTime": "2024-06-28T00:00:00+00:00/PT1H", "value": 14.444444444444445}, {"validTime": "2024-06-28T01:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-06-28T02:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-28T03:00:00+00:00/PT1H", "value": 11.666666666666666}, {"validTime": "2024-06-28T04:00:00+00:00/PT1H", "value": 10}, {"validTime": "2024-06-28T05:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-28T06:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-06-28T07:00:00+00:00/PT1H", "value": 6.111111111111111}, {"validTime": "2024-06-28T08:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-06-28T09:00:00+00:00/PT1H", "value": 5}, {"validTime": "2024-06-28T10:00:00+00:00/PT1H", "value": 3.888888888888889}, {"validTime": "2024-06-28T11:00:00+00:00/PT2H", "value": 2.7777777777777777}, {"validTime": "2024-06-28T13:00:00+00:00/PT1H", "value": 4.444444444444445}, {"validTime": "2024-06-28T14:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-06-28T15:00:00+00:00/PT1H", "value": 8.88888888888889}, {"validTime": "2024-06-28T16:00:00+00:00/PT1H", "value": 10.555555555555555}, {"validTime": "2024-06-28T17:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-28T18:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-06-28T19:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-06-28T20:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-06-28T21:00:00+00:00/PT4H", "value": 16.666666666666668}, {"validTime": "2024-06-29T01:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-06-29T02:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-06-29T03:00:00+00:00/PT1H", "value": 14.444444444444445}, {"validTime": "2024-06-29T04:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-29T05:00:00+00:00/PT1H", "value": 10.555555555555555}, {"validTime": "2024-06-29T06:00:00+00:00/PT1H", "value": 9.444444444444445}, {"validTime": "2024-06-29T07:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-29T08:00:00+00:00/PT2H", "value": 7.777777777777778}, {"validTime": "2024-06-29T10:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-06-29T11:00:00+00:00/PT2H", "value": 5.555555555555555}, {"validTime": "2024-06-29T13:00:00+00:00/PT1H", "value": 7.777777777777778}, {"validTime": "2024-06-29T14:00:00+00:00/PT1H", "value": 10}, {"validTime": "2024-06-29T15:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-29T16:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-06-29T17:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-29T18:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-29T19:00:00+00:00/PT1H", "value": 19.444444444444443}, {"validTime": "2024-06-29T20:00:00+00:00/PT3H", "value": 20.555555555555557}, {"validTime": "2024-06-29T23:00:00+00:00/PT1H", "value": 20}, {"validTime": "2024-06-30T00:00:00+00:00/PT1H", "value": 18.88888888888889}, {"validTime": "2024-06-30T01:00:00+00:00/PT1H", "value": 18.333333333333332}, {"validTime": "2024-06-30T02:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-30T03:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-06-30T04:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-06-30T05:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-30T06:00:00+00:00/PT1H", "value": 11.666666666666666}, {"validTime": "2024-06-30T07:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-06-30T08:00:00+00:00/PT1H", "value": 10.555555555555555}, {"validTime": "2024-06-30T09:00:00+00:00/PT1H", "value": 10}, {"validTime": "2024-06-30T10:00:00+00:00/PT1H", "value": 8.88888888888889}, {"validTime": "2024-06-30T11:00:00+00:00/PT2H", "value": 8.333333333333334}, {"validTime": "2024-06-30T13:00:00+00:00/PT1H", "value": 9.444444444444445}, {"validTime": "2024-06-30T14:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-06-30T15:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-06-30T16:00:00+00:00/PT1H", "value": 14.444444444444445}, {"validTime": "2024-06-30T17:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-06-30T18:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-06-30T19:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-06-30T20:00:00+00:00/PT4H", "value": 17.77777777777778}, {"validTime": "2024-07-01T00:00:00+00:00/PT1H", "value": 17.22222222222222}, {"validTime": "2024-07-01T01:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-07-01T02:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-07-01T03:00:00+00:00/PT1H", "value": 14.444444444444445}, {"validTime": "2024-07-01T04:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-07-01T05:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-07-01T06:00:00+00:00/PT1H", "value": 10}, {"validTime": "2024-07-01T07:00:00+00:00/PT1H", "value": 8.88888888888889}, {"validTime": "2024-07-01T08:00:00+00:00/PT1H", "value": 7.777777777777778}, {"validTime": "2024-07-01T09:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-07-01T10:00:00+00:00/PT1H", "value": 6.111111111111111}, {"validTime": "2024-07-01T11:00:00+00:00/PT2H", "value": 5.555555555555555}, {"validTime": "2024-07-01T13:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-07-01T14:00:00+00:00/PT1H", "value": 8.88888888888889}, {"validTime": "2024-07-01T15:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-07-01T16:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-07-01T17:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-07-01T18:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-07-01T19:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-07-01T20:00:00+00:00/PT4H", "value": 16.666666666666668}, {"validTime": "2024-07-02T00:00:00+00:00/PT1H", "value": 16.11111111111111}, {"validTime": "2024-07-02T01:00:00+00:00/PT1H", "value": 15}, {"validTime": "2024-07-02T02:00:00+00:00/PT1H", "value": 13.88888888888889}, {"validTime": "2024-07-02T03:00:00+00:00/PT1H", "value": 12.777777777777779}, {"validTime": "2024-07-02T04:00:00+00:00/PT1H", "value": 11.11111111111111}, {"validTime": "2024-07-02T05:00:00+00:00/PT1H", "value": 9.444444444444445}, {"validTime": "2024-07-02T06:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-07-02T07:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-07-02T08:00:00+00:00/PT1H", "value": 6.111111111111111}, {"validTime": "2024-07-02T09:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-07-02T10:00:00+00:00/PT1H", "value": 4.444444444444445}, {"validTime": "2024-07-02T11:00:00+00:00/PT2H", "value": 3.3333333333333335}, {"validTime": "2024-07-02T13:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-07-02T14:00:00+00:00/PT1H", "value": 7.777777777777778}, {"validTime": "2024-07-02T15:00:00+00:00/PT1H", "value": 10.555555555555555}, {"validTime": "2024-07-02T16:00:00+00:00/PT1H", "value": 12.222222222222221}, {"validTime": "2024-07-02T17:00:00+00:00/PT1H", "value": 14.444444444444445}, {"validTime": "2024-07-02T18:00:00+00:00/PT1H", "value": 15.555555555555555}, {"validTime": "2024-07-02T19:00:00+00:00/PT1H", "value": 16.666666666666668}, {"validTime": "2024-07-02T20:00:00+00:00/PT1H", "value": 17.77777777777778}, {"validTime": "2024-07-02T21:00:00+00:00/PT2H", "value": 18.333333333333332}, {"validTime": "2024-07-02T23:00:00+00:00/PT2H", "value": 17.77777777777778}]}, "heatIndex": {"uom": "wmoUnit:degC", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT1H", "value": "None"}, {"validTime": "2024-06-25T16:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-25T17:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-06-25T18:00:00+00:00/PT1H", "value": 26.666666666666668}, {"validTime": "2024-06-25T19:00:00+00:00/PT1H", "value": 27.22222222222222}, {"validTime": "2024-06-25T20:00:00+00:00/PT1H", "value": 28.333333333333332}, {"validTime": "2024-06-25T21:00:00+00:00/PT1H", "value": 28.88888888888889}, {"validTime": "2024-06-25T22:00:00+00:00/PT3H", "value": 29.444444444444443}, {"validTime": "2024-06-26T01:00:00+00:00/PT1H", "value": 28.333333333333332}, {"validTime": "2024-06-26T02:00:00+00:00/PT1H", "value": 27.77777777777778}, {"validTime": "2024-06-26T03:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-06-26T04:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-26T05:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-06-26T06:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-06-26T07:00:00+00:00/PT8H", "value": "None"}, {"validTime": "2024-06-26T15:00:00+00:00/PT1H", "value": 21.11111111111111}, {"validTime": "2024-06-26T16:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-26T17:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-06-26T18:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-06-26T19:00:00+00:00/PT1H", "value": 26.666666666666668}, {"validTime": "2024-06-26T20:00:00+00:00/PT2H", "value": 27.22222222222222}, {"validTime": "2024-06-26T22:00:00+00:00/PT1H", "value": 27.77777777777778}, {"validTime": "2024-06-26T23:00:00+00:00/PT2H", "value": 27.22222222222222}, {"validTime": "2024-06-27T01:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-06-27T02:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-06-27T03:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-27T04:00:00+00:00/PT18H", "value": "None"}, {"validTime": "2024-06-27T22:00:00+00:00/PT3H", "value": 21.11111111111111}, {"validTime": "2024-06-28T01:00:00+00:00/PT20H", "value": "None"}, {"validTime": "2024-06-28T21:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-06-28T22:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-06-28T23:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-06-29T00:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-06-29T01:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-29T02:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-29T03:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-06-29T04:00:00+00:00/PT13H", "value": "None"}, {"validTime": "2024-06-29T17:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-06-29T18:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-29T19:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-06-29T20:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-06-29T21:00:00+00:00/PT1H", "value": 26.666666666666668}, {"validTime": "2024-06-29T22:00:00+00:00/PT2H", "value": 27.22222222222222}, {"validTime": "2024-06-30T00:00:00+00:00/PT1H", "value": 26.666666666666668}, {"validTime": "2024-06-30T01:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-06-30T02:00:00+00:00/PT1H", "value": 24.444444444444443}, {"validTime": "2024-06-30T03:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-06-30T04:00:00+00:00/PT14H", "value": "None"}, {"validTime": "2024-06-30T18:00:00+00:00/PT1H", "value": 21.11111111111111}, {"validTime": "2024-06-30T19:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-06-30T20:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-06-30T21:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-06-30T22:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-06-30T23:00:00+00:00/PT2H", "value": 24.444444444444443}, {"validTime": "2024-07-01T01:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-07-01T02:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-07-01T03:00:00+00:00/PT17H", "value": "None"}, {"validTime": "2024-07-01T20:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-07-01T21:00:00+00:00/PT1H", "value": 22.77777777777778}, {"validTime": "2024-07-01T22:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-07-01T23:00:00+00:00/PT2H", "value": 24.444444444444443}, {"validTime": "2024-07-02T01:00:00+00:00/PT1H", "value": 23.333333333333332}, {"validTime": "2024-07-02T02:00:00+00:00/PT1H", "value": 21.666666666666668}, {"validTime": "2024-07-02T03:00:00+00:00/PT16H", "value": "None"}, {"validTime": "2024-07-02T19:00:00+00:00/PT1H", "value": 22.22222222222222}, {"validTime": "2024-07-02T20:00:00+00:00/PT1H", "value": 23.88888888888889}, {"validTime": "2024-07-02T21:00:00+00:00/PT1H", "value": 25}, {"validTime": "2024-07-02T22:00:00+00:00/PT1H", "value": 26.11111111111111}, {"validTime": "2024-07-02T23:00:00+00:00/PT1H", "value": 25.555555555555557}, {"validTime": "2024-07-03T00:00:00+00:00/PT1H", "value": 26.11111111111111}]}, "windChill": {"uom": "wmoUnit:degC", "values": [{"validTime": "2024-06-25T15:00:00+00:00/P1DT19H", "value": "None"}, {"validTime": "2024-06-27T10:00:00+00:00/PT1H", "value": 7.777777777777778}, {"validTime": "2024-06-27T11:00:00+00:00/PT2H", "value": 6.111111111111111}, {"validTime": "2024-06-27T13:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-06-27T14:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-27T15:00:00+00:00/PT16H", "value": "None"}, {"validTime": "2024-06-28T07:00:00+00:00/PT1H", "value": 7.777777777777778}, {"validTime": "2024-06-28T08:00:00+00:00/PT2H", "value": 6.111111111111111}, {"validTime": "2024-06-28T10:00:00+00:00/PT1H", "value": 4.444444444444445}, {"validTime": "2024-06-28T11:00:00+00:00/PT1H", "value": 2.7777777777777777}, {"validTime": "2024-06-28T12:00:00+00:00/PT1H", "value": 3.888888888888889}, {"validTime": "2024-06-28T13:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-06-28T14:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-28T15:00:00+00:00/PT19H", "value": "None"}, {"validTime": "2024-06-29T10:00:00+00:00/PT1H", "value": 9.444444444444445}, {"validTime": "2024-06-29T11:00:00+00:00/PT1H", "value": 8.333333333333334}, {"validTime": "2024-06-29T12:00:00+00:00/PT1H", "value": 8.88888888888889}, {"validTime": "2024-06-29T13:00:00+00:00/PT22H", "value": "None"}, {"validTime": "2024-06-30T11:00:00+00:00/PT2H", "value": 8.88888888888889}, {"validTime": "2024-06-30T13:00:00+00:00/PT20H", "value": "None"}, {"validTime": "2024-07-01T09:00:00+00:00/PT1H", "value": 8.88888888888889}, {"validTime": "2024-07-01T10:00:00+00:00/PT1H", "value": 6.666666666666667}, {"validTime": "2024-07-01T11:00:00+00:00/PT1H", "value": 5}, {"validTime": "2024-07-01T12:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-07-01T13:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-07-01T14:00:00+00:00/PT18H", "value": "None"}, {"validTime": "2024-07-02T08:00:00+00:00/PT2H", "value": 7.777777777777778}, {"validTime": "2024-07-02T10:00:00+00:00/PT1H", "value": 5.555555555555555}, {"validTime": "2024-07-02T11:00:00+00:00/PT1H", "value": 3.888888888888889}, {"validTime": "2024-07-02T12:00:00+00:00/PT1H", "value": 5}, {"validTime": "2024-07-02T13:00:00+00:00/PT1H", "value": 7.222222222222222}, {"validTime": "2024-07-02T14:00:00+00:00/PT1H", "value": 10}, {"validTime": "2024-07-02T15:00:00+00:00/PT10H", "value": "None"}]}, "skyCover": {"uom": "wmoUnit:percent", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT3H", "value": 0}, {"validTime": "2024-06-25T18:00:00+00:00/PT3H", "value": 7}, {"validTime": "2024-06-25T21:00:00+00:00/PT3H", "value": 30}, {"validTime": "2024-06-26T00:00:00+00:00/PT3H", "value": 52}, {"validTime": "2024-06-26T03:00:00+00:00/PT3H", "value": 48}, {"validTime": "2024-06-26T06:00:00+00:00/PT6H", "value": 54}, {"validTime": "2024-06-26T12:00:00+00:00/PT3H", "value": 52}, {"validTime": "2024-06-26T15:00:00+00:00/PT3H", "value": 32}, {"validTime": "2024-06-26T18:00:00+00:00/PT3H", "value": 15}, {"validTime": "2024-06-26T21:00:00+00:00/PT3H", "value": 18}, {"validTime": "2024-06-27T00:00:00+00:00/PT3H", "value": 19}, {"validTime": "2024-06-27T03:00:00+00:00/PT3H", "value": 24}, {"validTime": "2024-06-27T06:00:00+00:00/PT3H", "value": 16}, {"validTime": "2024-06-27T09:00:00+00:00/PT3H", "value": 20}, {"validTime": "2024-06-27T12:00:00+00:00/PT3H", "value": 19}, {"validTime": "2024-06-27T15:00:00+00:00/PT3H", "value": 25}, {"validTime": "2024-06-27T18:00:00+00:00/PT3H", "value": 11}, {"validTime": "2024-06-27T21:00:00+00:00/PT3H", "value": 8}, {"validTime": "2024-06-28T00:00:00+00:00/PT3H", "value": 6}, {"validTime": "2024-06-28T03:00:00+00:00/PT3H", "value": 5}, {"validTime": "2024-06-28T06:00:00+00:00/PT3H", "value": 3}, {"validTime": "2024-06-28T09:00:00+00:00/PT3H", "value": 2}, {"validTime": "2024-06-28T12:00:00+00:00/PT3H", "value": 12}, {"validTime": "2024-06-28T15:00:00+00:00/PT3H", "value": 7}, {"validTime": "2024-06-28T18:00:00+00:00/PT3H", "value": 13}, {"validTime": "2024-06-28T21:00:00+00:00/PT3H", "value": 8}, {"validTime": "2024-06-29T00:00:00+00:00/PT3H", "value": 6}, {"validTime": "2024-06-29T03:00:00+00:00/PT3H", "value": 15}, {"validTime": "2024-06-29T06:00:00+00:00/PT3H", "value": 16}, {"validTime": "2024-06-29T09:00:00+00:00/PT3H", "value": 14}, {"validTime": "2024-06-29T12:00:00+00:00/PT3H", "value": 26}, {"validTime": "2024-06-29T15:00:00+00:00/PT6H", "value": 22}, {"validTime": "2024-06-29T21:00:00+00:00/PT3H", "value": 35}, {"validTime": "2024-06-30T00:00:00+00:00/PT3H", "value": 42}, {"validTime": "2024-06-30T03:00:00+00:00/PT3H", "value": 56}, {"validTime": "2024-06-30T06:00:00+00:00/PT3H", "value": 58}, {"validTime": "2024-06-30T09:00:00+00:00/PT3H", "value": 52}, {"validTime": "2024-06-30T12:00:00+00:00/PT6H", "value": 48}, {"validTime": "2024-06-30T18:00:00+00:00/PT6H", "value": 50}, {"validTime": "2024-07-01T00:00:00+00:00/PT3H", "value": 40}, {"validTime": "2024-07-01T03:00:00+00:00/PT3H", "value": 39}, {"validTime": "2024-07-01T06:00:00+00:00/PT3H", "value": 11}, {"validTime": "2024-07-01T09:00:00+00:00/PT3H", "value": 6}, {"validTime": "2024-07-01T12:00:00+00:00/PT3H", "value": 11}, {"validTime": "2024-07-01T15:00:00+00:00/PT3H", "value": 4}, {"validTime": "2024-07-01T18:00:00+00:00/PT3H", "value": 3}, {"validTime": "2024-07-01T21:00:00+00:00/PT6H", "value": 5}, {"validTime": "2024-07-02T03:00:00+00:00/PT3H", "value": 7}, {"validTime": "2024-07-02T06:00:00+00:00/PT3H", "value": 5}, {"validTime": "2024-07-02T09:00:00+00:00/PT3H", "value": 2}, {"validTime": "2024-07-02T12:00:00+00:00/PT3H", "value": 6}, {"validTime": "2024-07-02T15:00:00+00:00/PT3H", "value": 3}, {"validTime": "2024-07-02T18:00:00+00:00/PT3H", "value": 1}, {"validTime": "2024-07-02T21:00:00+00:00/PT3H", "value": 3}, {"validTime": "2024-07-03T00:00:00+00:00/PT3H", "value": 4}]}, "windDirection": {"uom": "wmoUnit:degree_(angle)", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT3H", "value": 210}, {"validTime": "2024-06-25T18:00:00+00:00/PT3H", "value": 200}, {"validTime": "2024-06-25T21:00:00+00:00/PT3H", "value": 220}, {"validTime": "2024-06-26T00:00:00+00:00/PT3H", "value": 240}, {"validTime": "2024-06-26T03:00:00+00:00/PT3H", "value": 220}, {"validTime": "2024-06-26T06:00:00+00:00/PT3H", "value": 210}, {"validTime": "2024-06-26T09:00:00+00:00/PT6H", "value": 200}, {"validTime": "2024-06-26T15:00:00+00:00/PT3H", "value": 210}, {"validTime": "2024-06-26T18:00:00+00:00/PT6H", "value": 230}, {"validTime": "2024-06-27T00:00:00+00:00/PT3H", "value": 240}, {"validTime": "2024-06-27T03:00:00+00:00/PT3H", "value": 290}, {"validTime": "2024-06-27T06:00:00+00:00/PT6H", "value": 310}, {"validTime": "2024-06-27T12:00:00+00:00/PT3H", "value": 300}, {"validTime": "2024-06-27T15:00:00+00:00/PT3H", "value": 310}, {"validTime": "2024-06-27T18:00:00+00:00/PT3H", "value": 280}, {"validTime": "2024-06-27T21:00:00+00:00/PT3H", "value": 290}, {"validTime": "2024-06-28T00:00:00+00:00/PT3H", "value": 310}, {"validTime": "2024-06-28T03:00:00+00:00/PT3H", "value": 350}, {"validTime": "2024-06-28T06:00:00+00:00/PT6H", "value": 340}, {"validTime": "2024-06-28T12:00:00+00:00/PT3H", "value": 330}, {"validTime": "2024-06-28T15:00:00+00:00/PT3H", "value": 20}, {"validTime": "2024-06-28T18:00:00+00:00/PT3H", "value": 40}, {"validTime": "2024-06-28T21:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-29T03:00:00+00:00/PT3H", "value": 20}, {"validTime": "2024-06-29T06:00:00+00:00/PT3H", "value": 60}, {"validTime": "2024-06-29T09:00:00+00:00/PT3H", "value": 20}, {"validTime": "2024-06-29T12:00:00+00:00/PT6H", "value": 280}, {"validTime": "2024-06-29T18:00:00+00:00/PT3H", "value": 260}, {"validTime": "2024-06-29T21:00:00+00:00/PT3H", "value": 270}, {"validTime": "2024-06-30T00:00:00+00:00/PT3H", "value": 290}, {"validTime": "2024-06-30T03:00:00+00:00/PT3H", "value": 320}, {"validTime": "2024-06-30T06:00:00+00:00/PT3H", "value": 310}, {"validTime": "2024-06-30T09:00:00+00:00/PT3H", "value": 300}, {"validTime": "2024-06-30T12:00:00+00:00/PT3H", "value": 270}, {"validTime": "2024-06-30T15:00:00+00:00/PT9H", "value": 280}, {"validTime": "2024-07-01T00:00:00+00:00/PT3H", "value": 300}, {"validTime": "2024-07-01T03:00:00+00:00/PT3H", "value": 320}, {"validTime": "2024-07-01T06:00:00+00:00/PT3H", "value": 310}, {"validTime": "2024-07-01T09:00:00+00:00/PT3H", "value": 290}, {"validTime": "2024-07-01T12:00:00+00:00/PT3H", "value": 260}, {"validTime": "2024-07-01T15:00:00+00:00/PT3H", "value": 270}, {"validTime": "2024-07-01T18:00:00+00:00/PT3H", "value": 280}, {"validTime": "2024-07-01T21:00:00+00:00/PT3H", "value": 290}, {"validTime": "2024-07-02T00:00:00+00:00/PT3H", "value": 300}, {"validTime": "2024-07-02T03:00:00+00:00/PT3H", "value": 330}, {"validTime": "2024-07-02T06:00:00+00:00/PT3H", "value": 320}, {"validTime": "2024-07-02T09:00:00+00:00/PT3H", "value": 300}, {"validTime": "2024-07-02T12:00:00+00:00/PT3H", "value": 280}, {"validTime": "2024-07-02T15:00:00+00:00/PT3H", "value": 290}, {"validTime": "2024-07-02T18:00:00+00:00/PT6H", "value": 300}, {"validTime": "2024-07-03T00:00:00+00:00/PT3H", "value": 330}]}, "windSpeed": {"uom": "wmoUnit:km_h-1", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT3H", "value": 5.556}, {"validTime": "2024-06-25T18:00:00+00:00/PT3H", "value": 12.964}, {"validTime": "2024-06-25T21:00:00+00:00/PT3H", "value": 18.52}, {"validTime": "2024-06-26T00:00:00+00:00/PT3H", "value": 20.372}, {"validTime": "2024-06-26T03:00:00+00:00/PT9H", "value": 14.816}, {"validTime": "2024-06-26T12:00:00+00:00/PT3H", "value": 16.668}, {"validTime": "2024-06-26T15:00:00+00:00/PT3H", "value": 22.224}, {"validTime": "2024-06-26T18:00:00+00:00/PT3H", "value": 31.484}, {"validTime": "2024-06-26T21:00:00+00:00/PT3H", "value": 35.188}, {"validTime": "2024-06-27T00:00:00+00:00/PT3H", "value": 31.484}, {"validTime": "2024-06-27T03:00:00+00:00/PT3H", "value": 25.928}, {"validTime": "2024-06-27T06:00:00+00:00/PT3H", "value": 18.52}, {"validTime": "2024-06-27T09:00:00+00:00/PT3H", "value": 12.964}, {"validTime": "2024-06-27T12:00:00+00:00/PT3H", "value": 9.26}, {"validTime": "2024-06-27T15:00:00+00:00/PT3H", "value": 14.816}, {"validTime": "2024-06-27T18:00:00+00:00/PT3H", "value": 18.52}, {"validTime": "2024-06-27T21:00:00+00:00/PT6H", "value": 22.224}, {"validTime": "2024-06-28T03:00:00+00:00/PT3H", "value": 20.372}, {"validTime": "2024-06-28T06:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-06-28T09:00:00+00:00/PT3H", "value": 5.556}, {"validTime": "2024-06-28T12:00:00+00:00/PT3H", "value": 3.704}, {"validTime": "2024-06-28T15:00:00+00:00/PT3H", "value": 5.556}, {"validTime": "2024-06-28T18:00:00+00:00/PT3H", "value": 9.26}, {"validTime": "2024-06-28T21:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-06-29T00:00:00+00:00/PT3H", "value": 16.668}, {"validTime": "2024-06-29T03:00:00+00:00/PT3H", "value": 14.816}, {"validTime": "2024-06-29T06:00:00+00:00/PT3H", "value": 7.408}, {"validTime": "2024-06-29T09:00:00+00:00/PT3H", "value": 5.556}, {"validTime": "2024-06-29T12:00:00+00:00/PT6H", "value": 3.704}, {"validTime": "2024-06-29T18:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-06-29T21:00:00+00:00/PT3H", "value": 18.52}, {"validTime": "2024-06-30T00:00:00+00:00/PT3H", "value": 22.224}, {"validTime": "2024-06-30T03:00:00+00:00/PT3H", "value": 24.076}, {"validTime": "2024-06-30T06:00:00+00:00/PT3H", "value": 16.668}, {"validTime": "2024-06-30T09:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-06-30T12:00:00+00:00/PT3H", "value": 9.26}, {"validTime": "2024-06-30T15:00:00+00:00/PT3H", "value": 12.964}, {"validTime": "2024-06-30T18:00:00+00:00/PT3H", "value": 18.52}, {"validTime": "2024-06-30T21:00:00+00:00/PT3H", "value": 24.076}, {"validTime": "2024-07-01T00:00:00+00:00/PT3H", "value": 25.928}, {"validTime": "2024-07-01T03:00:00+00:00/PT3H", "value": 22.224}, {"validTime": "2024-07-01T06:00:00+00:00/PT3H", "value": 16.668}, {"validTime": "2024-07-01T09:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-07-01T12:00:00+00:00/PT3H", "value": 7.408}, {"validTime": "2024-07-01T15:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-07-01T18:00:00+00:00/PT3H", "value": 18.52}, {"validTime": "2024-07-01T21:00:00+00:00/PT3H", "value": 22.224}, {"validTime": "2024-07-02T00:00:00+00:00/PT3H", "value": 24.076}, {"validTime": "2024-07-02T03:00:00+00:00/PT3H", "value": 20.372}, {"validTime": "2024-07-02T06:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-07-02T09:00:00+00:00/PT3H", "value": 5.556}, {"validTime": "2024-07-02T12:00:00+00:00/PT3H", "value": 3.704}, {"validTime": "2024-07-02T15:00:00+00:00/PT3H", "value": 5.556}, {"validTime": "2024-07-02T18:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-07-02T21:00:00+00:00/PT3H", "value": 16.668}, {"validTime": "2024-07-03T00:00:00+00:00/PT3H", "value": 18.52}]}, "windGust": {"uom": "wmoUnit:km_h-1", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT3H", "value": 16.668}, {"validTime": "2024-06-25T18:00:00+00:00/PT3H", "value": 25.928}, {"validTime": "2024-06-25T21:00:00+00:00/PT6H", "value": 37.04}, {"validTime": "2024-06-26T03:00:00+00:00/PT6H", "value": 29.632}, {"validTime": "2024-06-26T09:00:00+00:00/PT3H", "value": 27.78}, {"validTime": "2024-06-26T12:00:00+00:00/PT3H", "value": 29.632}, {"validTime": "2024-06-26T15:00:00+00:00/PT3H", "value": 42.596}, {"validTime": "2024-06-26T18:00:00+00:00/PT3H", "value": 51.856}, {"validTime": "2024-06-26T21:00:00+00:00/PT3H", "value": 57.412}, {"validTime": "2024-06-27T00:00:00+00:00/PT3H", "value": 53.708}, {"validTime": "2024-06-27T03:00:00+00:00/PT3H", "value": 44.448}, {"validTime": "2024-06-27T06:00:00+00:00/PT3H", "value": 33.336}, {"validTime": "2024-06-27T09:00:00+00:00/PT3H", "value": 25.928}, {"validTime": "2024-06-27T12:00:00+00:00/PT3H", "value": 16.668}, {"validTime": "2024-06-27T15:00:00+00:00/PT3H", "value": 25.928}, {"validTime": "2024-06-27T18:00:00+00:00/PT3H", "value": 31.484}, {"validTime": "2024-06-27T21:00:00+00:00/PT6H", "value": 37.04}, {"validTime": "2024-06-28T03:00:00+00:00/PT3H", "value": 33.336}, {"validTime": "2024-06-28T06:00:00+00:00/PT3H", "value": 22.224}, {"validTime": "2024-06-28T09:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-06-28T12:00:00+00:00/PT3H", "value": 7.408}, {"validTime": "2024-06-28T15:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-06-28T18:00:00+00:00/PT3H", "value": 18.52}, {"validTime": "2024-06-28T21:00:00+00:00/PT3H", "value": 25.928}, {"validTime": "2024-06-29T00:00:00+00:00/PT3H", "value": 29.632}, {"validTime": "2024-06-29T03:00:00+00:00/PT3H", "value": 25.928}, {"validTime": "2024-06-29T06:00:00+00:00/PT3H", "value": 14.816}, {"validTime": "2024-06-29T09:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-06-29T12:00:00+00:00/PT3H", "value": 9.26}, {"validTime": "2024-06-29T15:00:00+00:00/PT3H", "value": 11.112}, {"validTime": "2024-06-29T18:00:00+00:00/PT3H", "value": 24.076}, {"validTime": "2024-06-29T21:00:00+00:00/PT3H", "value": 37.04}, {"validTime": "2024-06-30T00:00:00+00:00/PT3H", "value": 42.596}, {"validTime": "2024-06-30T03:00:00+00:00/PT3H", "value": 40.744}, {"validTime": "2024-06-30T06:00:00+00:00/PT3H", "value": 33.336}, {"validTime": "2024-06-30T09:00:00+00:00/PT3H", "value": 22.224}, {"validTime": "2024-06-30T12:00:00+00:00/PT3H", "value": 18.52}, {"validTime": "2024-06-30T15:00:00+00:00/PT3H", "value": 24.076}, {"validTime": "2024-06-30T18:00:00+00:00/PT3H", "value": 33.336}, {"validTime": "2024-06-30T21:00:00+00:00/PT3H", "value": 42.596}, {"validTime": "2024-07-01T00:00:00+00:00/PT3H", "value": 46.3}, {"validTime": "2024-07-01T03:00:00+00:00/PT3H", "value": 40.744}, {"validTime": "2024-07-01T06:00:00+00:00/PT3H", "value": 31.484}, {"validTime": "2024-07-01T09:00:00+00:00/PT3H", "value": 22.224}, {"validTime": "2024-07-01T12:00:00+00:00/PT3H", "value": 14.816}, {"validTime": "2024-07-01T15:00:00+00:00/PT3H", "value": 22.224}, {"validTime": "2024-07-01T18:00:00+00:00/PT3H", "value": 31.484}, {"validTime": "2024-07-01T21:00:00+00:00/PT3H", "value": 40.744}, {"validTime": "2024-07-02T00:00:00+00:00/PT3H", "value": 44.448}, {"validTime": "2024-07-02T03:00:00+00:00/PT3H", "value": 35.188}, {"validTime": "2024-07-02T06:00:00+00:00/PT3H", "value": 22.224}, {"validTime": "2024-07-02T09:00:00+00:00/PT3H", "value": 12.964}, {"validTime": "2024-07-02T12:00:00+00:00/PT3H", "value": 9.26}, {"validTime": "2024-07-02T15:00:00+00:00/PT3H", "value": 12.964}, {"validTime": "2024-07-02T18:00:00+00:00/PT3H", "value": 20.372}, {"validTime": "2024-07-02T21:00:00+00:00/PT3H", "value": 31.484}, {"validTime": "2024-07-03T00:00:00+00:00/PT3H", "value": 37.04}]}, + "weather": {"values": [{"validTime": "2024-06-25T15:00:00+00:00/PT15H", "value": [{"coverage": "None", "weather": "None", "intensity": "None", "visibility": {"unitCode": "wmoUnit:km", "value": "None"}, "attributes": []}]}, {"validTime": "2024-06-26T06:00:00+00:00/PT6H", "value": [{"coverage": "scattered", "weather": "thunderstorms", "intensity": "None", "visibility": {"unitCode": "wmoUnit:km", "value": "None"}, "attributes": []}, {"coverage": "scattered", "weather": "rain_showers", "intensity": "light", "visibility": {"unitCode": "wmoUnit:km", "value": "None"}, "attributes": []}]}, {"validTime": "2024-06-26T12:00:00+00:00/PT6H", "value": [{"coverage": "slight_chance", "weather": "thunderstorms", "intensity": "None", "visibility": {"unitCode": "wmoUnit:km", "value": "None"}, "attributes": []}, {"coverage": "slight_chance", "weather": "rain_showers", "intensity": "light", "visibility": {"unitCode": "wmoUnit:km", "value": "None"}, "attributes": []}]}, {"validTime": "2024-06-26T18:00:00+00:00/P3DT12H", "value": [{"coverage": "None", "weather": "None", "intensity": "None", "visibility": {"unitCode": "wmoUnit:km", "value": "None"}, "attributes": []}]}, {"validTime": "2024-06-30T06:00:00+00:00/PT12H", "value": [{"coverage": "slight_chance", "weather": "rain_showers", "intensity": "light", "visibility": {"unitCode": "wmoUnit:km", "value": "None"}, "attributes": []}]}, {"validTime": "2024-06-30T18:00:00+00:00/PT6H", "value": [{"coverage": "chance", "weather": "rain_showers", "intensity": "light", "visibility": {"unitCode": "wmoUnit:km", "value": "None"}, "attributes": []}]}, {"validTime": "2024-07-01T00:00:00+00:00/PT6H", "value": [{"coverage": "slight_chance", "weather": "rain_showers", "intensity": "light", "visibility": {"unitCode": "wmoUnit:km", "value": "None"}, "attributes": []}]}, {"validTime": "2024-07-01T06:00:00+00:00/P2D", "value": [{"coverage": "None", "weather": "None", "intensity": "None", "visibility": {"unitCode": "wmoUnit:km", "value": "None"}, "attributes": []}]}]}, + "hazards": {"values": [{"validTime": "2024-06-26T09:00:00+00:00/PT18H", "value": [{"phenomenon": "FW", "significance": "W", "event_number": 1}]}]}, + "probabilityOfPrecipitation": { + "uom": "wmoUnit:percent", + "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT9H", "value": 0}, {"validTime": "2024-06-26T00:00:00+00:00/PT6H", "value": 12}, {"validTime": "2024-06-26T06:00:00+00:00/PT6H", "value": 31}, {"validTime": "2024-06-26T12:00:00+00:00/PT6H", "value": 18}, {"validTime": "2024-06-26T18:00:00+00:00/PT6H", "value": 3}, {"validTime": "2024-06-27T00:00:00+00:00/PT6H", "value": 1}, {"validTime": "2024-06-27T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-27T12:00:00+00:00/PT12H", "value": 1}, {"validTime": "2024-06-28T00:00:00+00:00/P1DT18H", "value": 0}, {"validTime": "2024-06-29T18:00:00+00:00/PT6H", "value": 1}, {"validTime": "2024-06-30T00:00:00+00:00/PT6H", "value": 13}, {"validTime": "2024-06-30T06:00:00+00:00/PT6H", "value": 21}, {"validTime": "2024-06-30T12:00:00+00:00/PT6H", "value": 24}, {"validTime": "2024-06-30T18:00:00+00:00/PT6H", "value": 25}, {"validTime": "2024-07-01T00:00:00+00:00/PT6H", "value": 17}, {"validTime": "2024-07-01T06:00:00+00:00/PT12H", "value": 4}, {"validTime": "2024-07-01T18:00:00+00:00/PT6H", "value": 1}, {"validTime": "2024-07-02T00:00:00+00:00/P1DT6H", "value": 0}]}, "quantitativePrecipitation": {"uom": "wmoUnit:mm", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT3H", "value": 0}, {"validTime": "2024-06-25T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-26T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-26T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-26T12:00:00+00:00/PT6H", "value": 0.254}, {"validTime": "2024-06-26T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-27T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-27T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-27T12:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-27T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-28T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-28T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-28T12:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-28T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-29T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-29T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-29T12:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-29T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-30T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-30T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-30T12:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-30T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-07-01T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-07-01T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-07-01T12:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-07-01T18:00:00+00:00/PT6H", "value": 0}]}, "iceAccumulation": {"values": []}, "snowfallAmount": {"uom": "wmoUnit:mm", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT3H", "value": 0}, {"validTime": "2024-06-25T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-26T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-26T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-26T12:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-26T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-27T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-27T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-27T12:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-27T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-28T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-28T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-28T12:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-28T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-29T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-29T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-29T12:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-29T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-30T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-30T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-30T12:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-06-30T18:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-07-01T00:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-07-01T06:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-07-01T12:00:00+00:00/PT6H", "value": 0}, {"validTime": "2024-07-01T18:00:00+00:00/PT6H", "value": 0}]}, "snowLevel": {"uom": "wmoUnit:m", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT3H", "value": 3379.9272}, {"validTime": "2024-06-25T18:00:00+00:00/PT6H", "value": 3411.3216}, {"validTime": "2024-06-26T00:00:00+00:00/PT6H", "value": 3770.0712}, {"validTime": "2024-06-26T06:00:00+00:00/PT6H", "value": 3991.356}, {"validTime": "2024-06-26T12:00:00+00:00/PT6H", "value": 3959.6568}, {"validTime": "2024-06-26T18:00:00+00:00/PT6H", "value": 3610.0512}, {"validTime": "2024-06-27T00:00:00+00:00/PT6H", "value": 3407.9688}, {"validTime": "2024-06-27T06:00:00+00:00/PT6H", "value": 3228.7464}, {"validTime": "2024-06-27T12:00:00+00:00/PT6H", "value": 2718.816}, {"validTime": "2024-06-27T18:00:00+00:00/PT6H", "value": 2542.032}, {"validTime": "2024-06-28T00:00:00+00:00/PT6H", "value": 2795.6256}, {"validTime": "2024-06-28T06:00:00+00:00/PT6H", "value": 2798.3688}, {"validTime": "2024-06-28T12:00:00+00:00/PT6H", "value": 2635.9104}, {"validTime": "2024-06-28T18:00:00+00:00/PT6H", "value": 3109.8744}, {"validTime": "2024-06-29T00:00:00+00:00/PT6H", "value": 3411.9312}, {"validTime": "2024-06-29T06:00:00+00:00/PT6H", "value": 3453.9936}, {"validTime": "2024-06-29T12:00:00+00:00/PT6H", "value": 3443.0208}, {"validTime": "2024-06-29T18:00:00+00:00/PT6H", "value": 3564.0264}, {"validTime": "2024-06-30T00:00:00+00:00/PT6H", "value": 3659.7336}, {"validTime": "2024-06-30T06:00:00+00:00/PT6H", "value": 3553.968}, {"validTime": "2024-06-30T12:00:00+00:00/PT6H", "value": 3307.08}, {"validTime": "2024-06-30T18:00:00+00:00/PT6H", "value": 3324.1488}, {"validTime": "2024-07-01T00:00:00+00:00/PT6H", "value": 3376.8792}, {"validTime": "2024-07-01T06:00:00+00:00/PT6H", "value": 3226.9176}, {"validTime": "2024-07-01T12:00:00+00:00/PT6H", "value": 2784.9576}, {"validTime": "2024-07-01T18:00:00+00:00/PT6H", "value": 2981.8584}, {"validTime": "2024-07-02T00:00:00+00:00/PT6H", "value": 3130.9056}, {"validTime": "2024-07-02T06:00:00+00:00/PT6H", "value": 3003.804}, {"validTime": "2024-07-02T12:00:00+00:00/PT6H", "value": 2756.0016}, {"validTime": "2024-07-02T18:00:00+00:00/PT6H", "value": 3070.86}, {"validTime": "2024-07-03T00:00:00+00:00/PT6H", "value": 3298.8504}]}, "ceilingHeight": {"uom": "wmoUnit:m", "values": [{"validTime": "2024-06-25T15:00:00+00:00/P1DT16H", "value": -30.48}]}, "visibility": {"uom": "wmoUnit:m", "values": [{"validTime": "2024-06-25T15:00:00+00:00/P1DT16H", "value": 16093.44}]}, "transportWindSpeed": {"uom": "wmoUnit:km_h-1", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT1H", "value": 9.26}, {"validTime": "2024-06-25T16:00:00+00:00/PT12H", "value": 29.632}, {"validTime": "2024-06-26T04:00:00+00:00/PT12H", "value": 22.224}, {"validTime": "2024-06-26T16:00:00+00:00/PT12H", "value": 50.004}, {"validTime": "2024-06-27T04:00:00+00:00/PT12H", "value": 25.928}, {"validTime": "2024-06-27T16:00:00+00:00/PT12H", "value": 22.224}, {"validTime": "2024-06-28T04:00:00+00:00/PT12H", "value": 20.372}, {"validTime": "2024-06-28T16:00:00+00:00/PT12H", "value": 16.668}, {"validTime": "2024-06-29T04:00:00+00:00/PT12H", "value": 14.816}, {"validTime": "2024-06-29T16:00:00+00:00/P1D", "value": 24.076}, {"validTime": "2024-06-30T16:00:00+00:00/PT12H", "value": 25.928}, {"validTime": "2024-07-01T04:00:00+00:00/PT12H", "value": 22.224}, {"validTime": "2024-07-01T16:00:00+00:00/PT12H", "value": 24.076}]}, "transportWindDirection": {"uom": "wmoUnit:degree_(angle)", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT1H", "value": 180}, {"validTime": "2024-06-25T16:00:00+00:00/PT12H", "value": 220}, {"validTime": "2024-06-26T04:00:00+00:00/PT12H", "value": 210}, {"validTime": "2024-06-26T16:00:00+00:00/PT12H", "value": 230}, {"validTime": "2024-06-27T04:00:00+00:00/PT12H", "value": 320}, {"validTime": "2024-06-27T16:00:00+00:00/PT12H", "value": 290}, {"validTime": "2024-06-28T04:00:00+00:00/PT12H", "value": 10}, {"validTime": "2024-06-28T16:00:00+00:00/PT12H", "value": 250}, {"validTime": "2024-06-29T04:00:00+00:00/PT12H", "value": 110}, {"validTime": "2024-06-29T16:00:00+00:00/PT12H", "value": 240}, {"validTime": "2024-06-30T04:00:00+00:00/PT12H", "value": 290}, {"validTime": "2024-06-30T16:00:00+00:00/PT12H", "value": 280}, {"validTime": "2024-07-01T04:00:00+00:00/PT12H", "value": 310}, {"validTime": "2024-07-01T16:00:00+00:00/PT12H", "value": 280}]}, "mixingHeight": {"uom": "wmoUnit:m", "values": [{"validTime": "2024-06-25T15:00:00+00:00/PT1H", "value": 56.0832}, {"validTime": "2024-06-25T16:00:00+00:00/PT12H", "value": 3361.0296}, {"validTime": "2024-06-26T04:00:00+00:00/PT12H", "value": 121.0056}, {"validTime": "2024-06-26T16:00:00+00:00/PT12H", "value": 3167.4816}, {"validTime": "2024-06-27T04:00:00+00:00/PT12H", "value": 150.5712}, {"validTime": "2024-06-27T16:00:00+00:00/PT12H", "value": 2264.664}, {"validTime": "2024-06-28T04:00:00+00:00/PT12H", "value": 82.6008}, {"validTime": "2024-06-28T16:00:00+00:00/PT12H", "value": 2286}, {"validTime": "2024-06-29T04:00:00+00:00/PT12H", "value": 60.96}, {"validTime": "2024-06-29T16:00:00+00:00/PT12H", "value": 3617.3664}, {"validTime": "2024-06-30T04:00:00+00:00/PT12H", "value": 136.5504}, {"validTime": "2024-06-30T16:00:00+00:00/PT12H", "value": 3462.2232}, {"validTime": "2024-07-01T04:00:00+00:00/PT12H", "value": 89.916}, {"validTime": "2024-07-01T16:00:00+00:00/PT12H", "value": 2809.9512}]}, "hainesIndex": {"values": [{"validTime": "2024-06-25T15:00:00+00:00/PT21H", "value": 4}, {"validTime": "2024-06-26T12:00:00+00:00/P1D", "value": 3}, {"validTime": "2024-06-27T12:00:00+00:00/P1D", "value": 2}]}, "lightningActivityLevel": {"values": [{"validTime": "2024-06-25T15:00:00+00:00/PT15H", "value": 1}, {"validTime": "2024-06-26T06:00:00+00:00/PT6H", "value": 4}, {"validTime": "2024-06-26T12:00:00+00:00/PT6H", "value": 2}, {"validTime": "2024-06-26T18:00:00+00:00/P1DT18H", "value": 1}]}, "twentyFootWindSpeed": {"values": []}, "twentyFootWindDirection": {"values": []}, "waveHeight": {"values": []}, "wavePeriod": {"values": []}, "waveDirection": {"values": []}, "primarySwellHeight": {"values": []}, "primarySwellDirection": {"values": []}, "secondarySwellHeight": {"values": []}, "secondarySwellDirection": {"values": []}, "wavePeriod2": {"values": []}, "windWaveHeight": {"values": []}, "dispersionIndex": {"values": []}, "pressure": {"values": []}, "probabilityOfTropicalStormWinds": {"values": []}, "probabilityOfHurricaneWinds": {"values": []}, "potentialOf15mphWinds": {"values": []}, "potentialOf25mphWinds": {"values": []}, "potentialOf35mphWinds": {"values": []}, "potentialOf45mphWinds": {"values": []}, "potentialOf20mphWindGusts": {"values": []}, "potentialOf30mphWindGusts": {"values": []}, "potentialOf40mphWindGusts": {"values": []}, "potentialOf50mphWindGusts": {"values": []}, "potentialOf60mphWindGusts": {"values": []}, "grasslandFireDangerIndex": {"values": []}, "probabilityOfThunder": {"values": [{"validTime": "2024-06-25T15:00:00+00:00/PT3H", "value": 0}, {"validTime": "2024-06-25T18:00:00+00:00/PT6H", "value": 1}, {"validTime": "2024-06-26T00:00:00+00:00/PT6H", "value": 2}, {"validTime": "2024-06-26T06:00:00+00:00/PT6H", "value": 4}, {"validTime": "2024-06-26T12:00:00+00:00/PT6H", "value": 7}, {"validTime": "2024-06-26T18:00:00+00:00/PT6H", "value": 3}, {"validTime": "2024-06-27T00:00:00+00:00/PT6H", "value": 1}, {"validTime": "2024-06-27T06:00:00+00:00/P2DT18H", "value": 0}, {"validTime": "2024-06-30T00:00:00+00:00/PT6H", "value": 5}, {"validTime": "2024-06-30T06:00:00+00:00/PT6H", "value": 2}, {"validTime": "2024-06-30T12:00:00+00:00/PT6H", "value": 3}, {"validTime": "2024-06-30T18:00:00+00:00/PT6H", "value": 14}, {"validTime": "2024-07-01T00:00:00+00:00/PT6H", "value": 11}, {"validTime": "2024-07-01T06:00:00+00:00/PT12H", "value": 1}, {"validTime": "2024-07-01T18:00:00+00:00/PT6H", "value": 2}, {"validTime": "2024-07-02T00:00:00+00:00/PT6H", "value": 1}, {"validTime": "2024-07-02T06:00:00+00:00/PT18H", "value": 0}]}, "davisStabilityIndex": {"values": []}, "atmosphericDispersionIndex": {"values": []}, "lowVisibilityOccurrenceRiskIndex": {"values": []}, "stability": {"values": []}, "redFlagThreatIndex": {"values": []}}} diff --git a/tests/test_nws.py b/tests/test_nws.py new file mode 100644 index 0000000..f08129c --- /dev/null +++ b/tests/test_nws.py @@ -0,0 +1,98 @@ +import json +from datetime import datetime +from os.path import join +from pathlib import Path +from unittest.mock import patch, MagicMock + +import geopandas as gpd +import pandas as pd +import pytest +from shapely.geometry import Point + +from metloom.pointdata import NWSForecastPointData +from metloom.variables import NWSForecastVariables +from tests.test_point_data import BasePointDataTest + +DATA_DIR = str(Path(__file__).parent.joinpath("data/nws_mocks")) + + +class TestNWSForecast(BasePointDataTest): + @classmethod + def get_side_effect(cls, *args, **kwargs): + url = args[0] + if ".gov/gridpoints" in url: + with open(join(DATA_DIR, "meta_and_data.json")) as fp: + data = json.load(fp) + elif ".gov/points" in url: + with open(join(DATA_DIR, "initial_meta.json")) as fp: + data = json.load(fp) + else: + raise RuntimeError(f"{url} is an unknown option") + + obj = MagicMock() + obj.json.return_value = data + return obj + + @pytest.fixture(scope="class") + def mocked_requests(self): + with patch("requests.get") as mock_get: + mock_get.side_effect = self.get_side_effect + yield mock_get + + @pytest.fixture(scope="function") + def station(self, mocked_requests): + point1 = Point(-119, 43) + pt = NWSForecastPointData( + "test", None, initial_metadata=point1 + ) + yield pt + + @pytest.fixture(scope="class") + def expected_meta(self): + return Point(-118.99345926915265, 42.99291053264557, ) + + @pytest.fixture(scope="class") + def daily_expected(self, expected_meta): + dts = [ + '2024-06-25T00:00:00.000000000', '2024-06-26T00:00:00.000000000', + '2024-06-27T00:00:00.000000000', '2024-06-28T00:00:00.000000000', + '2024-06-29T00:00:00.000000000', '2024-06-30T00:00:00.000000000', + '2024-07-01T00:00:00.000000000', '2024-07-02T00:00:00.0000000', + '2024-07-03T00:00:00.0000000' + ] + temp_values = [ + 26.82539683, 23.647343, 16.18357488, 14.19191919, 19.46859903, + 18.68686869, 16.06280193, 16.61835749, 27.22222222] + df = pd.DataFrame() + df["datetime"] = pd.to_datetime(dts) + df["AIR TEMP"] = temp_values + df['AIR TEMP_units'] = ["degC"] * len(df) + df["site"] = ["test"] * len(df) + df["datasource"] = ["NWS Forecast"] * len(df) + df = gpd.GeoDataFrame(df, geometry=[expected_meta] * len(df)) + # needed to reorder the columns for the pd testing compare + df = df.filter( + [ + "datetime", + "geometry", + "AIR TEMP", + "site", + "AIR TEMP_units", + "datasource", + ] + ) + df.set_index(keys=["datetime", "site"], inplace=True) + return df + + def test_get_metadata(self, station, expected_meta): + result = station.metadata + assert expected_meta == result + + def test_get_daily_data(self, station, daily_expected): + response = station.get_daily_forecast( + [NWSForecastVariables.TEMP], + ) + pd.testing.assert_frame_equal( + response.sort_index(axis=1), + daily_expected.sort_index(axis=1) + ) From 4a742baa47cce835e19211799808cec508d2f944 Mon Sep 17 00:00:00 2001 From: Micah Sandusky Date: Wed, 26 Jun 2024 10:59:05 -0600 Subject: [PATCH 4/8] pass daily and hourly data --- tests/test_nws.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_nws.py b/tests/test_nws.py index f08129c..689fa1e 100644 --- a/tests/test_nws.py +++ b/tests/test_nws.py @@ -49,16 +49,16 @@ def station(self, mocked_requests): @pytest.fixture(scope="class") def expected_meta(self): - return Point(-118.99345926915265, 42.99291053264557, ) + return Point(-118.99345926915265, 42.99291053264557, 5000.00016) @pytest.fixture(scope="class") def daily_expected(self, expected_meta): dts = [ - '2024-06-25T00:00:00.000000000', '2024-06-26T00:00:00.000000000', - '2024-06-27T00:00:00.000000000', '2024-06-28T00:00:00.000000000', - '2024-06-29T00:00:00.000000000', '2024-06-30T00:00:00.000000000', - '2024-07-01T00:00:00.000000000', '2024-07-02T00:00:00.0000000', - '2024-07-03T00:00:00.0000000' + '2024-06-25T00:00:00+0000', '2024-06-26T00:00:00+0000', + '2024-06-27T00:00:00+0000', '2024-06-28T00:00:00+0000', + '2024-06-29T00:00:00+0000', '2024-06-30T00:00:00+0000', + '2024-07-01T00:00:00+0000', '2024-07-02T00:00:00+0000', + '2024-07-03T00:00:00+0000' ] temp_values = [ 26.82539683, 23.647343, 16.18357488, 14.19191919, 19.46859903, From 2c43bb6532bbcc8b23129c1580b2177dc42ec87a Mon Sep 17 00:00:00 2001 From: Micah Sandusky Date: Wed, 26 Jun 2024 11:07:50 -0600 Subject: [PATCH 5/8] NWS does not implement the normal get_daily_data, but instead implements a get_daily_forecast that ONLY takes in variable list. This is motivation to have a more generic class as a base that does not assume we will implement the get_daily_data methods, etc. --- metloom/pointdata/base.py | 198 ++++++++++++++++-------------- metloom/pointdata/nws_forecast.py | 8 +- 2 files changed, 109 insertions(+), 97 deletions(-) diff --git a/metloom/pointdata/base.py b/metloom/pointdata/base.py index 883adb6..9e9a10c 100644 --- a/metloom/pointdata/base.py +++ b/metloom/pointdata/base.py @@ -66,7 +66,12 @@ def __iter__(self): yield item -class PointData(object): +class GenericPoint(object): + """ + Class for storing metadata. and defining the expected data format + returned from `get_data` methods + + """ ALLOWED_VARIABLES = VariableBase ITERATOR_CLASS = PointDataCollection DATASOURCE = None @@ -74,12 +79,6 @@ class PointData(object): EXPECTED_INDICES = ["datetime", "site"] NON_VARIABLE_COLUMNS = EXPECTED_INDICES + EXPECTED_COLUMNS - # Default kwargs for function points from geometry - POINTS_FROM_GEOM_DEFAULTS = { - 'within_geometry': True, 'snow_courses': False, - 'buffer': 0.0, "filter_to_active": False - } - def __init__(self, station_id, name, metadata=None): """ @@ -94,6 +93,105 @@ def __init__(self, station_id, name, metadata=None): self._metadata = metadata self.desired_tzinfo = "UTC" + def _get_metadata(self): + """ + Method to get a shapely Point object to describe the station location + + Returns: + shapely.point.Point object in Longitude, Latitude + """ + raise NotImplementedError("_get_metadata is not implemented") + + def _handle_df_tz(self, val): + """ + Covert one entry from a df from cls.TZINFO to UTC + """ + if pd.isna(val): + return val + else: + local = val.tz_localize(self.tzinfo) + return local.tz_convert(self.desired_tzinfo) + + @property + def tzinfo(self): + """ + tzinfo that pandas can use for tz_localize + """ + return self._tzinfo + + @property + def metadata(self): + """ + metadata property + Returns: + shapely.point.Point object in Longitude, Latitude with z in ft + """ + if self._metadata is None: + self._metadata = self._get_metadata() + return self._metadata + + @classmethod + def validate_sensor_df(cls, gdf: gpd.GeoDataFrame): + """ + Validate that the GeoDataFrame returned is formatted correctly. + The goal of this method is to ensure base classes are returning a + consistent format of dataframe + """ + if gdf is None: + return + assert isinstance(gdf, gpd.GeoDataFrame) + columns = gdf.columns + index_names = gdf.index.names + # check for required indexes + for ei in cls.EXPECTED_INDICES: + if ei not in index_names: + raise DataValidationError( + f"{ei} was expected, but not found as an" + f" index of the final dataframe" + ) + # check for expected columns - avoid modifying at class level + expected_columns = copy.deepcopy(cls.EXPECTED_COLUMNS) + possible_extras = ["measurementDate", "quality_code"] + for pe in possible_extras: + if pe in columns: + expected_columns += [pe] + for column in expected_columns: + if column not in columns: + raise DataValidationError( + f"{column} was expected, but not found as a" + f" column of the final dataframe" + ) + + remaining_columns = [c for c in columns if c not in expected_columns] + # make sure all variables have a units column as well + for rc in remaining_columns: + if "_units" not in rc: + assert f"{rc}_units" in remaining_columns + + def __repr__(self): + return f"{self.__class__.__name__}({self.id!r}, {self.name!r})" + + def __str__(self): + return f"{self.name} ({self.id})" + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + return self.id == other.id and self.name == other.name + + +class PointData(GenericPoint): + """ + Extend GenericPoint and add functions for finding data from geometry + and for gettings daily, hourly, or snow course data + """ + + # Default kwargs for function points from geometry + POINTS_FROM_GEOM_DEFAULTS = { + 'within_geometry': True, 'snow_courses': False, + 'buffer': 0.0, "filter_to_active": False + } + def get_daily_data( self, start_date: datetime, @@ -169,43 +267,6 @@ def get_snow_course_data( """ raise NotImplementedError("get_snow_course_data is not implemented") - def _get_metadata(self): - """ - Method to get a shapely Point object to describe the station location - - Returns: - shapely.point.Point object in Longitude, Latitude - """ - raise NotImplementedError("_get_metadata is not implemented") - - def _handle_df_tz(self, val): - """ - Covert one entry from a df from cls.TZINFO to UTC - """ - if pd.isna(val): - return val - else: - local = val.tz_localize(self.tzinfo) - return local.tz_convert(self.desired_tzinfo) - - @property - def tzinfo(self): - """ - tzinfo that pandas can use for tz_localize - """ - return self._tzinfo - - @property - def metadata(self): - """ - metadata property - Returns: - shapely.point.Point object in Longitude, Latitude with z in ft - """ - if self._metadata is None: - self._metadata = self._get_metadata() - return self._metadata - @classmethod def _add_default_kwargs(cls, kwargs): """ @@ -240,52 +301,3 @@ def points_from_geometry( PointDataCollection """ raise NotImplementedError("points_from_geometry not implemented") - - @classmethod - def validate_sensor_df(cls, gdf: gpd.GeoDataFrame): - """ - Validate that the GeoDataFrame returned is formatted correctly. - The goal of this method is to ensure base classes are returning a - consistent format of dataframe - """ - if gdf is None: - return - assert isinstance(gdf, gpd.GeoDataFrame) - columns = gdf.columns - index_names = gdf.index.names - # check for required indexes - for ei in cls.EXPECTED_INDICES: - if ei not in index_names: - raise DataValidationError( - f"{ei} was expected, but not found as an" - f" index of the final dataframe" - ) - # check for expected columns - avoid modifying at class level - expected_columns = copy.deepcopy(cls.EXPECTED_COLUMNS) - possible_extras = ["measurementDate", "quality_code"] - for pe in possible_extras: - if pe in columns: - expected_columns += [pe] - for column in expected_columns: - if column not in columns: - raise DataValidationError( - f"{column} was expected, but not found as a" - f" column of the final dataframe" - ) - - remaining_columns = [c for c in columns if c not in expected_columns] - # make sure all variables have a units column as well - for rc in remaining_columns: - if "_units" not in rc: - assert f"{rc}_units" in remaining_columns - - def __repr__(self): - return f"{self.__class__.__name__}({self.id!r}, {self.name!r})" - - def __str__(self): - return f"{self.name} ({self.id})" - - def __eq__(self, other): - if not isinstance(other, self.__class__): - return False - return self.id == other.id and self.name == other.name diff --git a/metloom/pointdata/nws_forecast.py b/metloom/pointdata/nws_forecast.py index af015fd..366c8f1 100644 --- a/metloom/pointdata/nws_forecast.py +++ b/metloom/pointdata/nws_forecast.py @@ -7,14 +7,14 @@ from geopandas import GeoDataFrame from metloom.dataframe_utils import merge_df, resample_whole_df -from metloom.pointdata.base import PointData +from metloom.pointdata.base import GenericPoint from metloom.variables import SensorDescription, NWSForecastVariables LOG = logging.getLogger(__name__) -class NWSForecastPointData(PointData): +class NWSForecastPointData(GenericPoint): """ Implementation for NWS forecast API https://www.weather.gov/documentation/services-web-api @@ -104,7 +104,7 @@ def _get_metadata(self): # use the grid points to find the center of the forecast cell - url = f"https://api.weather.gov/gridpoints/" \ + url = f"{self.URL}/gridpoints/" \ f"{self._office}/{self._gridx},{self._gridy}" resp = requests.get(url) resp.raise_for_status() @@ -130,7 +130,7 @@ def _get_observations(self): # ensure we have office, gridx, and gridy set if self._metadata is None: self._get_metadata() - url = f"https://api.weather.gov/gridpoints/" \ + url = f"{self.URL}/gridpoints/" \ f"{self._office}/{self._gridx},{self._gridy}" resp = requests.get(url) resp.raise_for_status() From 8373694738ef76eec6fd5a08b7b9e0d1accf952b Mon Sep 17 00:00:00 2001 From: Micah Sandusky Date: Wed, 26 Jun 2024 11:18:03 -0600 Subject: [PATCH 6/8] No need from from_geometry anymore --- metloom/pointdata/nws_forecast.py | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/metloom/pointdata/nws_forecast.py b/metloom/pointdata/nws_forecast.py index 366c8f1..d133e61 100644 --- a/metloom/pointdata/nws_forecast.py +++ b/metloom/pointdata/nws_forecast.py @@ -289,25 +289,3 @@ def get_forecast( """ # Do not resample return self._get_data(variables) - - @classmethod - def points_from_geometry( - cls, - geometry: gpd.GeoDataFrame, - variables: List[SensorDescription], - **kwargs - ): - """ - See docstring for PointData.points_from_geometry - - Args: - geometry: GeoDataFrame for shapefile from gpd.read_file - variables: List of SensorDescription - within_geometry: filter the points to within the shapefile - instead of just the extents. Default True - buffer: buffer added to search box - - Returns: - PointDataCollection - """ - raise NotImplementedError("Not implemented for NWS") From 83c4b3f4a3a17ef82133d78292d4c4704bf10feb Mon Sep 17 00:00:00 2001 From: Micah Sandusky Date: Wed, 26 Jun 2024 11:18:14 -0600 Subject: [PATCH 7/8] Add some usage and README stuff --- README.rst | 1 + docs/usage.rst | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/README.rst b/README.rst index 46f00b9..09388ae 100644 --- a/README.rst +++ b/README.rst @@ -42,6 +42,7 @@ Features * `SNOTEL `_ * `MESOWEST `_ * `USGS `_ + * `NWS FORECAST `_ * `GEOSPHERE AUSTRIA `_ * `UCSB CUES `_ * `MET NORWAY `_ diff --git a/docs/usage.rst b/docs/usage.rst index b3bbd48..b168ca8 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -58,6 +58,40 @@ use metloom to find 15-minute streamflow from USGS:: print(df) +National Weather Service (NWS) Forecast +--------------------------------------- + +The NWS forecast pulls the current forecast starting from today. When defining +a point, give it your own name and id, and make sure to provide the latitude +and longitude as a ``shapely point`` for the initial metadata. + +Then you can use ``get_daily_forecast`` or ``get_hourly_forecast`` +to retrive data. + +**Note: the data will be aggregated to hourly or daily using mean or sum depending** +**on ``accumulated=True`` on the variable description** + +Also - the point metadata is the **center of the NWS pixel** containing +your initial input point. + +Example of pulling the daily forecast:: + + from metloom.pointdata import NWSForecastPointData + from metloom.variables import NWSForecastVariables + from shapely.geometry import Point + + inintial_point = Point(-119, 43) + pt = NWSForecastPointData( + "my_point_id", "my_point_name", initial_metadata=inintial_point + ) + + df = pt.get_daily_forecast([ + NWSForecastVariables.TEMP, + NWSForecastVariables.PRECIPITATIONACCUM, + ] + + + Mesowest -------- You can also use the Mesowest network if you sign up for an API token which is From ff720564ffb8c85dd08e24ec745638adc29b0ecc Mon Sep 17 00:00:00 2001 From: Micah Sandusky Date: Wed, 26 Jun 2024 11:26:34 -0600 Subject: [PATCH 8/8] flake8 --- metloom/pointdata/nws_forecast.py | 7 +++---- metloom/variables.py | 1 - tests/test_nws.py | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/metloom/pointdata/nws_forecast.py b/metloom/pointdata/nws_forecast.py index d133e61..be84c65 100644 --- a/metloom/pointdata/nws_forecast.py +++ b/metloom/pointdata/nws_forecast.py @@ -1,5 +1,5 @@ import logging -from datetime import timedelta, timezone +from datetime import timedelta, timezone from typing import List import pandas as pd import geopandas as gpd @@ -83,8 +83,7 @@ def _get_initial_metadata(self): """ # use the initial metadata to find the grid points for the forecast resp = requests.get( - self.URL + - f"/points/{self._inital_metadata.y},{self._inital_metadata.x}" + f"{self.URL}/points/{self._inital_metadata.y},{self._inital_metadata.x}" ) resp.raise_for_status() data = resp.json() @@ -190,7 +189,7 @@ def _sensor_response_to_df( # add other expected columns df[f"{sensor.name}_units"] = [unit_str] * len(df) - df[f"site"] = [self.id] * len(df) + df["site"] = [self.id] * len(df) # keep the column names final_columns += [ diff --git a/metloom/variables.py b/metloom/variables.py index c5aeca6..0007798 100644 --- a/metloom/variables.py +++ b/metloom/variables.py @@ -367,4 +367,3 @@ class NWSForecastVariables(VariableBase): ) DEWPOINT = SensorDescription("dewpoint", "DEW POINT TEMPERATURE") RH = SensorDescription("relativeHumidity", "RELATIVE HUMIDITY") - diff --git a/tests/test_nws.py b/tests/test_nws.py index 689fa1e..3b07270 100644 --- a/tests/test_nws.py +++ b/tests/test_nws.py @@ -1,5 +1,4 @@ import json -from datetime import datetime from os.path import join from pathlib import Path from unittest.mock import patch, MagicMock