Source code for miranda.eccc._utils
from __future__ import annotations
import logging.config
from collections.abc import Mapping
from datetime import datetime as dt
from miranda.scripting import LOGGING_CONFIG
__all__ = ["cf_station_metadata", "cf_ahccd_metadata"]
logging.config.dictConfig(LOGGING_CONFIG)
[docs]
def cf_station_metadata(variable_code: int | str) -> Mapping[str, int | float | str]:
"""
Parameters
----------
variable_code: int or str
Returns
-------
dict
"""
ec_hourly_variables = {
"001": {
"_table_name": {"DLY02", "DLY04", "DLY44"},
"original_units": "0.1 °C",
"raw_units": "degC",
"units": "K",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Daily Maximum Temperature",
"standard_name": "air_temperature_maximum",
"nc_name": "tasmax",
},
"002": {
"_table_name": {"DLY02", "DLY04", "DLY44"},
"original_units": "0.1 °C",
"raw_units": "degC",
"units": "K",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Daily Minimum Temperature",
"standard_name": "air_temperature_minimum",
"nc_name": "tasmin",
},
"003": {
"_table_name": {"DLY02", "DLY04", "DLY44"},
"original_units": "0.1 °C",
"raw_units": "degC",
"units": "K",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Daily Mean Temperature",
"standard_name": "air_temperature",
"nc_name": "tas",
},
"010": {
"_table_name": {"DLY02", "DLY04", "DLY44"},
"original_units": "0.1 mm day-1",
"raw_units": "mm",
"units": "m",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Daily Total Rainfall",
"standard_name": "liquid_precipitation_amount",
"nc_name": "prlptot",
},
"011": {
"_table_name": {"DLY02", "DLY04", "DLY44"},
"original_units": "0.1 cm day-1",
"raw_units": "cm",
"units": "m",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Daily Total Snowfall",
"standard_name": "solid_precipitation_amount",
"nc_name": "prsntot",
},
"012": {
"_table_name": {"DLY02", "DLY04", "DLY44"},
"original_units": "0.1 mm day-1",
"raw_units": "mm",
"units": "m",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Daily Total Precipitation",
"standard_name": "precipitation_amount",
"nc_name": "prcptot",
},
"013": {
"_table_name": {"DLY02", "DLY04", "DLY44"},
"original_units": "cm",
"raw_units": "cm",
"units": "m",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Snow on the Ground",
"standard_name": "surface_snow_thickness",
"nc_name": "sndtot",
},
"014": {
"_table_name": {"DLY02", "DLY04", "DLY44"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Thunderstorms",
"standard_name": "thunderstorm_presence",
"nc_name": "thunder",
},
"015": {
"_table_name": {"DLY02", "DLY04", "DLY44"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Freezing rain or drizzle",
"standard_name": "freeze_rain_drizzle_presence",
"nc_name": "freezing_rain_drizzle",
},
"016": {
"_table_name": {"DLY02", "DLY04", "DLY44"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Hail",
"standard_name": "hail_presence",
"nc_name": "hail",
},
"017": {
"_table_name": {"DLY02", "DLY04", "DLY44"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Fog or Ice Fog",
"standard_name": "fog_ice_fog_presence",
"nc_name": "fog_ice_fog",
},
"018": {
"_table_name": {"DLY02", "DLY04"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Smoke or Haze",
"standard_name": "smoke_haze_presence",
"nc_name": "smoke_haze",
},
"019": {
"_table_name": {"DLY02", "DLY04"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Blowing Dust or Sand",
"standard_name": "blowing_dust_sand_presence",
"nc_name": "blowing_dust_sand",
},
"020": {
"_table_name": {"DLY02", "DLY04"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Blowing snow",
"standard_name": "blowing_snow_presence",
"nc_name": "blow_snow",
},
"021": {
"_table_name": {"DLY02", "DLY04"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Wind speed >= 28 Knots",
"standard_name": "wind_exceeding_28_knots",
"nc_name": "wind_gt_28kt",
},
"022": {
"_table_name": {"DLY02", "DLY04"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Wind speed >= 34 Knots",
"standard_name": "wind_exceeding_34_knots",
"nc_name": "wind_gt_34kt",
},
"023": {
"_table_name": {"DLY02", "DLY04"},
"original_units": "10's of degrees",
"raw_units": "deg",
"units": "deg",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Direction of extreme gust (16 pts) to December 1976",
"standard_name": "gust_to_direction",
"nc_name": "gust_dir_16pts",
},
"024": {
"_table_name": {"DLY02", "DLY04"},
"original_units": "km/h",
"raw_units": "km h-1",
"units": "m s-1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Speed of extreme gust",
"standard_name": "wind_speed_of_gust",
"nc_name": "gust_speed",
},
"025": {
"_table_name": {"DLY02", "DLY04"},
"raw_units": "h",
"units": "h",
"scale_factor": 1,
"add_offset": 0,
"long_name": "UTC hour of extreme gust",
"standard_name": "hour_of_extreme_gust",
"nc_name": "gust_hour",
},
"061": {
"_table_name": {"HLY11"},
"original_units": "0.001 MJ/m",
"raw_units": "W m-2 h-1",
"units": "W m-2 h-1",
"scale_factor": 1e6 / (60 * 60),
"add_offset": 0,
"long_name": "RF1 global solar radiation",
"standard_name": "solar_radiation_flux",
"nc_name": "rf1_radiation",
},
"062": {
"_table_name": {"HLY11"},
"original_units": "0.001 MJ/m",
"raw_units": "W m-2 h-1",
"units": "W m-2 h-1",
"scale_factor": 1e6 / (60 * 60),
"add_offset": 0,
"long_name": "RF2 sky (diffuse) radiation",
"standard_name": "solar_radiation_flux",
"nc_name": "rf2_radiation",
},
"063": {
"_table_name": {"HLY11"},
"original_units": "0.001 MJ/m",
"raw_units": "W m-2 h-1",
"units": "W m-2 h-1",
"scale_factor": 1e6 / (60 * 60),
"add_offset": 0,
"long_name": "RF3 reflected solar radiation",
"standard_name": "solar_radiation_flux",
"nc_name": "rf3_radiation",
},
"064": {
"_table_name": {"HLY11"},
"original_units": "0.001 MJ/m",
"raw_units": "W m-2 h-1",
"units": "W m-2 h-1",
"scale_factor": 1e6 / (60 * 60),
"add_offset": 0,
"long_name": "RF4 net all wave radiation",
"standard_name": "solar_radiation_flux",
"nc_name": "rf4_radiation",
},
"067": {
"_table_name": {"HLY11"},
"original_units": "0.01 Kilolux_hrs",
"raw_units": "lux h",
"units": "lux h",
"scale_factor": 10,
"add_offset": 0,
"long_name": "RF7 daylight illumination",
"standard_name": "solar_radiation_flux",
"nc_name": "rf7_radiation",
},
"068": {
"_table_name": {"HLY11"},
"original_units": "0.001 MJ/m",
"raw_units": "W m-2 h-1",
"units": "W m-2 h-1",
"scale_factor": 1e6 / (60 * 60),
"add_offset": 0,
"long_name": "RF8 direct solar radiation",
"standard_name": "solar_radiation_flux",
"nc_name": "rf8_radiation",
},
"069": {
"_table_name": {"HLY15"},
"original_units": "10's of degrees",
"raw_units": "deg",
"units": "deg",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Direction - 45B anemometer (8 pts)",
"standard_name": "wind_to_direction",
"nc_name": "wind_dir_45B",
},
"071": {
"_table_name": {"HLY01"},
"original_units": "30's of meters",
"raw_units": "m",
"units": "m",
"scale_factor": 30,
"add_offset": 0,
"long_name": "Ceiling height of lowest layer of clouds",
"standard_name": "ceiling_cloud_height",
"nc_name": "ceiling_hgt",
},
"072": {
"_table_name": {"HLY01"},
"original_units": "0.1 km",
"raw_units": "km",
"units": "m",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Visibility",
"standard_name": "visibility_in_air",
"nc_name": "visibility",
},
"073": {
"_table_name": {"HLY01"},
"original_units": "0.01 kPa",
"raw_units": "Pa",
"units": "Pa",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Sea Level Pressure",
"standard_name": "air_pressure_at_mean_sea_level",
"nc_name": "psl",
},
"074": {
"_table_name": {"HLY01"},
"original_units": "0.1 °C",
"raw_units": "degC",
"units": "K",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Dew Point Temperature",
"standard_name": "dew_point_temperature",
"nc_name": "tds",
},
"075": {
"_table_name": {"HLY01"},
"original_units": "10's of degrees",
"raw_units": "deg",
"units": "deg",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Wind Direction at 2 m (U2A Anemometer) (16 pts)",
"standard_name": "wind_direction_u2a",
"nc_name": "wind_dir_u2a_16",
},
"076": {
"_table_name": {"HLY01"},
"original_units": "km/h",
"raw_units": "km h-1",
"units": "m s-1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Wind Speed - U2A (16 pts) to December 1970",
"standard_name": "wind_speed_u2a",
"nc_name": "wind_speed_u2a",
},
"077": {
"_table_name": {"HLY01"},
"original_units": "0.01 kPa",
"raw_units": "Pa",
"units": "Pa",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Station Pressure",
"standard_name": "atmospheric_pressure",
"nc_name": "pressure",
},
"078": {
"_table_name": {"HLY01"},
"original_units": "0.1 °C",
"raw_units": "degC",
"units": "K",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Dry Bulb Temperature",
"standard_name": "dry_bulb_temperature",
"nc_name": "tas_dry",
},
"079": {
"_table_name": {"HLY01"},
"original_units": "0.1 °C",
"raw_units": "degC",
"units": "K",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Wet Bulb temperature",
"standard_name": "wet_bulb_temperature",
"nc_name": "tas_wet",
},
"080": {
"_table_name": {"HLY01"},
"original_units": "%",
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Relative Humidity",
"standard_name": "relative_humidity",
"nc_name": "hur",
},
"081": {
"_table_name": {"HLY01"},
"original_units": "%",
"raw_units": "1",
"units": "1",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Total Cloud Opacity",
"standard_name": "cloud_albedo",
"nc_name": "clo",
},
"082": {
"_table_name": {"HLY01"},
"original_units": "%",
"raw_units": "1",
"units": "1",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Total Cloud Amount",
"standard_name": "cloud_area_fraction",
"nc_name": "clt",
},
"089": {
"_table_name": {"HLY01"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Freezing Rain",
"standard_name": "freezing_rain",
"nc_name": "freeze_rain",
},
"094": {
"_table_name": {"HLY01"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Ice Pellets",
"standard_name": "ice_pellet_presence",
"nc_name": "ice_pellets",
},
"107": {
"_table_name": {"HLY01"},
"original_units": "Tenths",
"raw_units": "1",
"units": "1",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Lowest cloud layer opacity",
"standard_name": "low_type_cloud_opacity_fraction",
"nc_name": "1low_cloud_opac",
},
"108": {
"_table_name": {"HLY01"},
"original_units": "Tenths",
"raw_units": "1",
"units": "1",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Lowest cloud layer amount or condition",
"standard_name": "low_type_cloud_area_fraction",
"nc_name": "1low_cloud_frac",
},
"109": {
"_table_name": {"HLY01"},
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Lowest cloud layer type",
"standard_name": "low_type_cloud_type",
"nc_name": "1low_cloud_type",
},
"110": {
"_table_name": {"HLY01"},
"original_units": "30's of meters",
"raw_units": "m",
"units": "m",
"scale_factor": 30,
"add_offset": 0,
"long_name": "Lowest cloud layer height",
"standard_name": "low_type_cloud_height",
"nc_name": "1low_cloud_hgt",
},
"111": {
"_table_name": {"HLY01"},
"original_units": "Tenths",
"raw_units": "1",
"units": "1",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Second lowest cloud layer opacity",
"standard_name": "low_type_cloud_opacity_fraction",
"nc_name": "2low_cloud_opac",
},
"112": {
"_table_name": {"HLY01"},
"original_units": "Tenths",
"raw_units": "1",
"units": "1",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Second lowest cloud layer amount or condition",
"standard_name": "low_type_cloud_area_fraction",
"nc_name": "2low_cloud_frac",
},
"113": {
"_table_name": {"HLY01"},
"original_units": "",
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Second lowest cloud layer type",
"standard_name": "low_type_cloud_type",
"nc_name": "2low_cloud_type",
},
"114": {
"_table_name": {"HLY01"},
"original_units": "30's of meters",
"raw_units": "m",
"units": "m",
"scale_factor": 30,
"add_offset": 0,
"long_name": "Second lowest cloud layer height",
"standard_name": "low_type_cloud_height",
"nc_name": "2low_cloud_hgt",
},
"115": {
"_table_name": {"HLY01"},
"original_units": "Tenths",
"raw_units": "1",
"units": "1",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Thirsd lowest cloud layer opacity",
"standard_name": "low_type_cloud_opacity_fraction",
"nc_name": "3low_cloud_opac",
},
"116": {
"_table_name": {"HLY01"},
"original_units": "Tenths",
"raw_units": "1",
"units": "1",
"scale_factor": 10,
"add_offset": 0,
"long_name": "Third lowest cloud layer amount or condition",
"standard_name": "low_type_cloud_area_fraction",
"nc_name": "3low_cloud_frac",
},
"117": {
"_table_name": {"HLY01"},
"original_units": "",
"raw_units": "1",
"units": "1",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Third lowest cloud layer type",
"standard_name": "low_type_cloud_type",
"nc_name": "3low_cloud_type",
},
"118": {
"_table_name": {"HLY01"},
"original_units": "30's of meters",
"raw_units": "m",
"units": "m",
"scale_factor": 30,
"add_offset": 0,
"long_name": "Third lowest cloud layer height",
"standard_name": "low_type_cloud_height",
"nc_name": "3low_cloud_hgt",
},
"123": {
"_table_name": {"HLY01"},
"original_units": "0.1 mm",
"raw_units": "mm h-1",
"units": "kg m2 s-1",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Total Rainfall",
"standard_name": "rainfall_flux",
"nc_name": "rainfall",
},
"133": {
"_table_name": {"HLY10"},
"original_units": "0.1 hrs",
"raw_units": "h",
"units": "s",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Sunshine",
"standard_name": "duration_of_sunshine",
"nc_name": "sun",
},
"156": {
"_table_name": {"HLY01"},
"original_units": "10's of degrees",
"raw_units": "deg",
"units": "deg",
"scale_factor": 10,
"long_name": "Wind Direction - U2A (36 pts) from January 1971",
"standard_name": "wind_direction_u2a",
"nc_name": "wind_dir_u2a_36",
},
"262": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 mm",
"raw_units": "mm",
"units": "kg m-2",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Total Precipitation (minutes 00-60)",
"standard_name": "precipitation_amount",
"nc_name": "prtot",
},
"263": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 mm",
"raw_units": "mm",
"units": "kg m-2",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Total Precipitation (minutes 00-15)",
"standard_name": "precipitation_amount",
"nc_name": "prtot_q1",
},
"264": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 mm",
"raw_units": "mm",
"units": "kg m-2",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Total Precipitation (minutes 15-30)",
"standard_name": "precipitation_amount",
"nc_name": "prtot_q2",
},
"265": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 mm",
"raw_units": "mm",
"units": "kg m-2",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Total Precipitation (minutes 30-45)",
"standard_name": "precipitation_amount",
"nc_name": "prtot_q3",
},
"266": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 mm",
"raw_units": "mm",
"units": "kg m-2",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Total Precipitation (minutes 45-60)",
"standard_name": "precipitation_amount",
"nc_name": "prtot_q4",
},
"267": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 kg/m²",
"raw_units": "kg m-2",
"units": "kg m-2",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Precipitation Gauge Weight per Unit Area (at minute 15)",
"standard_name": "precipitation_amount",
"nc_name": "precipitation_weight_q1",
},
"268": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 kg/m²",
"raw_units": "kg m-2",
"units": "kg m-2",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Precipitation Gauge Weight per Unit Area (at minute 30)",
"standard_name": "precipitation_amount",
"nc_name": "precipitation_weight_q2",
},
"269": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 kg/m²",
"raw_units": "kg m-2",
"units": "kg m-2",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Precipitation Gauge Weight per Unit Area (at minute 45)",
"standard_name": "precipitation_amount",
"nc_name": "precipitation_weight_q3",
},
"270": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 kg/m²",
"raw_units": "kg m-2",
"units": "kg m-2",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Precipitation Gauge Weight per Unit Area (at minute 60)",
"standard_name": "precipitation_amount",
"nc_name": "precipitation_weight_q4",
},
"271": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 km/h",
"raw_units": "km h-1",
"nc_units": "m s-1",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Wind Speed at 2 m (minutes 00-15)",
"standard_name": "wind_speed",
"nc_name": "wind_speed_q1",
},
"272": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 km/h",
"raw_units": "km h-1",
"nc_units": "m s-1",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Wind Speed at 2 m (minutes 15-30)",
"standard_name": "wind_speed",
"nc_name": "wind_speed_q2",
},
"273": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 km/h",
"raw_units": "km h-1",
"nc_units": "m s-1",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Wind Speed at 2 m (minutes 30-45)",
"standard_name": "wind_speed",
"nc_name": "wind_speed_q3",
},
"274": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 km/h",
"raw_units": "km h-1",
"nc_units": "m s-1",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Wind Speed at 2 m (minutes 45-60)",
"standard_name": "wind_speed",
"nc_name": "wind_speed_q4",
},
"275": {
"_table_name": {"HLY01_RCS"},
"original_units": "cm",
"raw_units": "cm",
"units": "m",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Snow Depth (at minute 60)",
"standard_name": "surface_snow_thickness",
"nc_name": "snd_q4",
},
"276": {
"_table_name": {"HLY01_RCS"},
"original_units": "cm",
"raw_units": "cm",
"units": "m",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Snow Depth (at minute 15)",
"standard_name": "surface_snow_thickness",
"nc_name": "snd_q1",
},
"277": {
"_table_name": {"HLY01_RCS"},
"original_units": "cm",
"raw_units": "cm",
"units": "m",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Snow Depth (at minute 30)",
"standard_name": "surface_snow_thickness",
"nc_name": "snd_q2",
},
"278": {
"_table_name": {"HLY01_RCS"},
"original_units": "cm",
"raw_units": "cm",
"units": "m",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Snow Depth (at minute 45)",
"standard_name": "surface_snow_thickness",
"nc_name": "snd_q3",
},
"279": {
"_table_name": {"HLY01_RCS"},
"original_units": "Degrees",
"raw_units": "deg",
"nc_units": "deg",
"scale_factor": 1,
"add_offset": 0,
"long_name": "Wind Direction at 2 m (minutes 50-60)",
"standard_name": "wind_direction",
"nc_name": "wind_dir",
},
"280": {
"_table_name": {"HLY01_RCS"},
"original_units": "0.1 km/h",
"raw_units": "km h-1",
"units": "m s-1",
"scale_factor": 0.1,
"add_offset": 0,
"long_name": "Wind Speed at 2 m (minutes 50-60)",
"standard_name": "wind_speed",
"nc_name": "wind_speed",
},
}
code = str(variable_code).zfill(3)
if code in ["061"]:
raise NotImplementedError()
try:
variable = ec_hourly_variables[code]
variable["missing_flags"] = "M"
variable["missing_values"] = {-9999, "#####"}
variable["least_significant_digit"] = ""
except KeyError:
logging.error(f"Hourly variable `{code}` not supported.")
raise
return variable
[docs]
def cf_ahccd_metadata(
code: str, gen: int
) -> (dict[str, int | float | str], dict, list[tuple[int, int]], int):
"""
Parameters
----------
code: {"dx", "dn", "dm", "dt", "ds", "dr"}
gen: {1, 2, 3}
Returns
-------
dict[str, int or str or float], dict, list[tuple[int, int]], int
"""
generation = {1: "First", 2: "Second", 3: "Third"}.get(gen)
ec_ahccd_attrs = dict(
dx=dict(
variable="tasmax",
units="degC",
standard_name="air_temperature",
long_name="Near-Surface Maximum Daily Air Temperature",
comment=f"ECCC {generation} Generation of Adjusted and Homogenized Temperature Data",
),
dn=dict(
variable="tasmin",
units="degC",
standard_name="air_temperature",
long_name="Near-Surface Minimum Daily Air Temperature",
comment=f"ECCC {generation} Generation of Adjusted and Homogenized Temperature Data",
),
dm=dict(
variable="tas",
units="degC",
standard_name="air_temperature",
long_name="Near-Surface Daily Mean Air Temperature",
comment=f"ECCC {generation} Generation of Adjusted and Homogenized Temperature Data",
),
dt=dict(
variable="pr",
units="mm d-1",
standard_name="precipitation_flux",
long_name="Daily Total Precipitation",
comment=f"ECCC {generation} Generation of Adjusted and Homogenized Precipitation Data",
),
ds=dict(
variable="prsn",
units="mm d-1",
standard_name="snowfall_flux",
long_name="Daily Snowfall",
comment=f"ECCC {generation} Generation of Adjusted and Homogenized Precipitation Data",
),
dr=dict(
variable="prlp",
units="mm d-1",
standard_name="rainfall_flux",
long_name="Daily Rainfall",
comment=f"ECCC {generation} Generation of Adjusted and Homogenized Precipitation Data",
),
)
try:
variable = ec_ahccd_attrs[code]
variable["missing_flags"] = "M"
if variable["variable"].startswith("tas"):
variable["NaN_value"] = -9999.9
column_names = [
"No",
"StnId",
"Station name",
"Prov",
"FromYear",
"FromMonth",
"ToYear",
"ToMonth",
"%Miss",
"Lat(deg)",
"Long(deg)",
"Elev(m)",
"Joined",
"RCS",
]
column_spaces = [(0, 5), (5, 6), (6, 8), (8, 9)]
ii = 9
for i in range(1, 32):
column_spaces.append((ii, ii + 7))
ii += 7
column_spaces.append((ii, ii + 1))
ii += 1
header_row = 3
elif variable["variable"].startswith("pr"):
variable["NaN_value"] = -9999.99
column_names = [
"Prov",
"Station name",
"stnid",
"beg yr",
"beg mon",
"end yr",
"end mon",
"lat (deg)",
"long (deg)",
"elev (m)",
"stns joined",
]
column_spaces = [(0, 4), (4, 5), (5, 7), (7, 8)]
ii = 8
for i in range(1, 32):
column_spaces.append((ii, ii + 8))
ii += 8
column_spaces.append((ii, ii + 1))
ii += 1
header_row = 0
else:
raise KeyError
column_names = {
col.lower()
.split("(")[0]
.replace("%", "pct_")
.strip()
.replace(" ", "_"): col
for col in list(column_names)
}
if gen == 3:
_citation = (
"Vincent, L.A., M.M. Hartwell and X.L. Wang, 2020: A Third Generation of Homogenized "
"Temperature for Trend Analysis and Monitoring Changes in Canada’s Climate. "
"Atmosphere-Ocean. https://doi.org/10.1080/07055900.2020.1765728"
)
elif gen == 2:
_citation = (
"Mekis, É and L.A. Vincent, 2011: An overview of the second generation adjusted daily "
"precipitation dataset for trend analysis in Canada. Atmosphere-Ocean 49(2), "
"163-177 doi:10.1080/07055900.2011.583910"
)
else:
msg = f"Generation '{gen}' not supported."
raise NotImplementedError(msg)
global_attrs = dict(
title=f"{generation} Generation of Homogenized Daily {variable['variable']} "
"for Canada (Updated to December 2019)",
history=f"{dt.today().strftime('%Y-%m-%d')}: Convert from original format to NetCDF",
type="station_obs",
institute="Environment and Climate Change Canada",
institute_id="ECCC",
dataset_id=f"AHCCD_gen{gen}_day_{variable['variable']}",
frequency="day",
license_type="permissive",
license="https:/open.canada.ca/en/open-government-licence-canada",
citation=_citation,
)
except KeyError as e:
msg = f"AHCCD variable '{code}' or generation '{gen}' not supported."
logging.error(msg)
raise NotImplementedError(msg) from e
return variable, column_names, column_spaces, header_row, global_attrs