diff --git a/HISTORY.rst b/HISTORY.rst index f3add1b66..5e8916c7d 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -22,10 +22,10 @@ New indicators Breaking changes ^^^^^^^^^^^^^^^^ -* Indices that accept `lat` or `lon` coordinates in their call signatures will now use `cf-xarray` accessors to gather these variables in the event that they are not explicitly supplied. (:pull:`1180`). This affects the following +* Indices that accept `lat` or `lon` coordinates in their call signatures will now use `cf-xarray` accessors to gather these variables in the event that they are not explicitly supplied. (:pull:`1180`). This affects the following: - ``huglin_index``, ``biologically_effective_degree_days``, ``cool_night_index``, ``latitude_temperature_index``, ``water_budget``, ``potential_evapotranspiration`` * ``cool_night_index`` now optionally accepts ``lat: str = "north" | "south"`` for calculating CNI over DataArrays lacking a latitude coordinate. (:pull:`1180`). -* The offset value in ``standardized_precipitation_evapotranspiration_index`` is changed to better reproduce results in the reference library ``monocongo/climate_indices``. +* The offset value in ``standardized_precipitation_evapotranspiration_index`` is changed to better reproduce results in the reference library ``monocongo/climate_indices``. (:issue:`1141`, :pull:`1183`). * The ``first_day_below`` and ``first_day_above`` indices are now deprecated in order to clearly communicate the variables they act upon (:issue:`1175`, :pull:`1186`). The suggested migrations are as follows: - ``xclim.indices.first_day_above`` -> ``xclim.indices.first_day_temperature_above`` - ``xclim.indices.first_day_below`` -> ``xclim.indices.first_day_temperature_below`` @@ -36,6 +36,11 @@ Breaking changes * Running `pytest` now requires the `pytest-dist` distributed testing dependency. This library has been added to the `dev` requirements and conda environment configuration. (:pull:`1203`). * Parameters ``reducer`` and ``window`` in ``xclim.indices.rle_statistics`` are now positional. (:pull:`1161`). * The ``relative_annual_cycle_amplitude`` and ``annual_cycle_amplitude`` have been rewritten to match the version defined in the VALUE project, outputs will change drastically (for the better) (:pull:`1198`). +* English indicator metadata has been adjusted to remove frequencies from fields in the `long_name` of indicators. English indicators now have an explicit `title` and `abstract`. (:issue:`936`, :pull:`1123`). +* French indicator metadata translations are now more uniform and more closely follow agreed-upon grammar conventions, while also removing frequency fields in `long_name_fr`. (:issue:`936`, :pull:`1123`). +* The ``freshet_start`` indice is now deprecated in favour of ``first_day_temperature_above`` with `thresh='0 degC', window=5`. The `freshet_start` indicator is now based on ``first_day_temperature_above``, but is otherwise unaffected. (:issue:`1195`, :pull:`1196`). +* Call signatures for several indices/indicators have been modified to optionally accept `op` for manually setting threshold comparison operators (:issue:`1194`, :pull:`1197`). The affected indices and indicators as follows: + - ``hot_spell_max_length``, ``hot_spell_frequency``, ``cold_spell_days``, ``cold_spell_frequency``, ``heat_wave_index``, ``warm_day_frequency`` (indice only), ``warm_night_frequency`` (indice only), ``dry_days``, ``wetdays``, ``wetdays_prop``. Bug fixes ^^^^^^^^^ @@ -111,7 +116,7 @@ Bug fixes * Fixed some ``extlink`` warnings found in `sphinx` and configured ReadTheDocs to use `mamba` as the dependency solver. (:issue:`1139`, :pull:`1140`). * Fixed some broken hyperlinks to articles, users, and external documentation throughout the code base and jupyter notebooks. (:pull:`1160`). * Addressed a bug that was causing `pylint` to stackoverflow by removing it from the tox configuration. `pylint` should only be called from an active environment. (:pull:`1163`) -* Fixed kmeans_reduce_ensemble breaking when using dask arrays (:pull:`1170`) +* Fixed an issue with ``xclim.ensembles.kmeans_reduce_ensemble`` which caused it to fail when using dask arrays. (:pull:`1170`). * Addressed a bug that was causing `pylint` to stackoverflow by removing it from the tox configuration. `pylint` should only be called from an active environment. (:pull:`1163`) Internal changes diff --git a/xclim/core/formatting.py b/xclim/core/formatting.py index 8aaacf18a..0f2c69125 100644 --- a/xclim/core/formatting.py +++ b/xclim/core/formatting.py @@ -20,18 +20,18 @@ from xclim.core.utils import InputKind, PercentileDataArray DEFAULT_FORMAT_PARAMS = { - "tasmin_per_thresh": "{unkown}", - "tasmin_per_window": "{unkown}", - "tasmin_per_period": "{unkown}", - "tas_per_thresh": "{unkown}", - "tas_per_window": "{unkown}", - "tas_per_period": "{unkown}", - "tasmax_per_thresh": "{unkown}", - "tasmax_per_window": "{unkown}", - "tasmax_per_period": "{unkown}", - "pr_per_thresh": "{unkown}", - "pr_per_window": "{unkown}", - "pr_per_period": "{unkown}", + "tasmin_per_thresh": "{unknown}", + "tasmin_per_window": "{unknown}", + "tasmin_per_period": "{unknown}", + "tas_per_thresh": "{unknown}", + "tas_per_window": "{unknown}", + "tas_per_period": "{unknown}", + "tasmax_per_thresh": "{unknown}", + "tasmax_per_window": "{unknown}", + "tasmax_per_period": "{unknown}", + "pr_per_thresh": "{unknown}", + "pr_per_window": "{unknown}", + "pr_per_period": "{unknown}", } @@ -53,7 +53,8 @@ def __init__( mapping : Mapping[str, Sequence[str]] A mapping from values to their possible variations. modifiers : Sequence[str] - The list of modifiers, must be the as long as the longest value of `mapping`. Cannot include reserved modifier 'r'. + The list of modifiers, must be the as long as the longest value of `mapping`. + Cannot include reserved modifier 'r'. """ super().__init__() if "r" in modifiers: @@ -431,8 +432,7 @@ def _call_and_add_history(*args, **kwargs): def gen_call_string(funcname: str, *args, **kwargs): """Generate a signature string for use in the history attribute. - DataArrays and Dataset are replaced with their name, while Nones, floats, - ints and strings are printed directly. + DataArrays and Dataset are replaced with their name, while Nones, floats, ints and strings are printed directly. All other objects have their type printed between < >. Arguments given through positional arguments are printed positionnally and those diff --git a/xclim/core/utils.py b/xclim/core/utils.py index 05014802f..ac435e15c 100644 --- a/xclim/core/utils.py +++ b/xclim/core/utils.py @@ -18,7 +18,6 @@ from inspect import Parameter, _empty # noqa from io import StringIO from pathlib import Path -from types import FunctionType from typing import Callable, Mapping, NewType, Sequence import numpy as np @@ -47,14 +46,12 @@ } -def wrapped_partial( - func: FunctionType, suggested: dict | None = None, **fixed -) -> Callable: +def wrapped_partial(func: Callable, suggested: dict | None = None, **fixed) -> Callable: """Wrap a function, updating its signature but keeping its docstring. Parameters ---------- - func : FunctionType + func : Callable The function to be wrapped suggested : dict, optional Keyword arguments that should have new default values but still appear in the signature. @@ -97,14 +94,14 @@ def wrapped_partial( # TODO Reconsider the utility of this -def walk_map(d: dict, func: FunctionType) -> dict: +def walk_map(d: dict, func: Callable) -> dict: """Apply a function recursively to values of dictionary. Parameters ---------- d : dict Input dictionary, possibly nested. - func : FunctionType + func : Callable Function to apply to dictionary values. Returns diff --git a/xclim/data/fr.json b/xclim/data/fr.json index 9d9e871d1..25afcd9dd 100644 --- a/xclim/data/fr.json +++ b/xclim/data/fr.json @@ -47,7 +47,7 @@ "hivernale", "hivernaux", "hivernales", - "hivers" + "hiver" ], "MAM": [ "printanier", @@ -61,14 +61,14 @@ "estivale", "estivaux", "estivales", - "étés" + "été" ], "SON": [ "automnal", "automnale", "automnaux", "automnales", - "automnes" + "automne" ], "norm": [ "normal", @@ -151,10 +151,10 @@ ] }, "RAIN_FRZGR": { - "long_name": "Nombre de jours de pluie sur sol gelé", - "description": "Nombre {freq:m} de jours avec plus de {thresh} de pluie suivant sept jours consécutifs où la température était sous 0°C. Les précipitations sont considérées comme de la pluie lorsque la température moyenne est au-dessus de 0°C.", + "long_name": "Nombre de jours de pluie sur sol gelé (température > 0℃ et précipitation > {thresh})", + "description": "Nombre {freq:m} de jours avec plus de {thresh} de pluie suivant sept (7) jours consécutifs où la température était sous 0°C. Les précipitations sont considérées comme de la pluie lorsque la température moyenne est au-dessus de 0°C.", "title": "Nombre de jours de pluie sur sol gelé", - "abstract": "Nombre de jours avec des précipitations au-dessus d'un certain seuil après 7 jours consécutifs où la température était sous 0°C. Les précipitations sont considérées comme de la pluie lorsque la température moyenne est au-dessus de 0°C." + "abstract": "Nombre de jours avec pluie au-dessus d'un seuil donné après sept (7) jours consécutifs où la température était sous 0°C. Les précipitations sont considérées comme de la pluie lorsque la température moyenne est au-dessus de 0°C." }, "RX1DAY": { "long_name": "Précipitation quotidienne maximale", @@ -169,439 +169,444 @@ "abstract": "Maximum de la somme mobile des précipitations quotidiennes pour une période donnée." }, "MAX_PR_INTENSITY": { - "long_name": "Intensité maximale de précipitation sur une durée de {window} h", - "description": "Intensité maximale {freq:f} de précipitation sur une fenêtre mobile de {window} h.", - "title": "Intensité de précipitation maximale sur une durée et période donnée", + "long_name": "Intensité maximale de précipitation horaire durant une fenêtre mobile temporelle de {window} h", + "description": "Intensité maximale {freq:f} de précipitation horaire durant une fenêtre mobile de {window} h.", + "title": "Intensité maximale de précipitation horaire durant une fenêtre mobile temporelle donnée", "keywords": "courbes IDF", - "abstract": "Maximum de l'intensité de précipitation horaire pour une durée et période donnée." + "abstract": "Maximum de l'intensité de précipitation horaire durant une fenêtre mobile temporelle donnée." }, "RPRCTOT": { - "long_name": "Proportion convective de la précipitation totale", + "long_name": "Proportion convective de la précipitation totale pour les jours avec une précipitation d'au moins {thresh}", "description": "Proportion de la précipitation totale {freq:f} due à la précipitation convective pour les jours avec une précipitation d'au moins {thresh}.", "title": "Proportion convective de la précipitation totale.", "abstract": "Proportion de la précipitation totale due aux processus de convections. Seuls les jours avec un flux minimum de précipitation sont considérés." }, "WETDAYS": { - "long_name": "Nombre de jours pluvieux (précip >= {thresh})", - "description": "Nombre {freq:m} de jours où les précipitations sont au-dessus de {thresh}.", + "long_name": "Nombre de jours où la précipitation est au-dessus ou égale à {thresh}", + "description": "Nombre {freq:m} de jours où la précipitation est au-dessus ou égale à {thresh}.", "title": "Jours mouillés", - "abstract": "Nombre de jours où les précipitations sont au-dessus d'un seuil." + "abstract": "Nombre de jours où la précipitation est au-dessus ou égale à un seuil donné." }, - "WETDAY_PROP": { - "long_name": "Proportion de jours pluvieux (précip >= {thresh})", - "description": "Propotion {freq:m} de jours où les précipitations sont au-dessus de {thresh}.", - "title": "Proportion de jours pluvieux", - "abstract": "Proportion de jours où les précipitations sont au-dessus d'un seuil." + "WETDAYS_PROP": { + "long_name": "Proportion de jours où les précipitations sont au-dessus ou égale à {thresh}", + "description": "Proportion {freq:m} de jours où les précipitations sont au-dessus ou égale à {thresh}.", + "title": "Proportion de jours avec précipitation", + "abstract": "Proportion de jours où la précipitation est au-dessus ou égale à un seuil donné." }, "CDD": { - "long_name": "Durée maximale d'une période sèche", - "description": "Nombre {freq:m} maximal de jours consécutifs où les précipitations sont sous {thresh}.", + "long_name": "Durée maximale d'une période où la précipitation est sous {thresh}", + "description": "Nombre {freq:m} maximal de jours consécutifs où la précipitation est sous {thresh}.", "title": "Nombre maximal de jours secs consécutifs", - "abstract": "Période la plus longue où la précipitation est sous un seuil." + "abstract": "Période la plus longue où la précipitation est sous un seuil donné." }, "CWD": { - "long_name": "Durée maximale d'une période pluvieuse", + "long_name": "Durée maximale d'une période où les précipitations sont au-dessus de {thresh}", "description": "Nombre {freq:m} maximal de jours consécutifs où les précipitations sont au-dessus de {thresh}.", "title": "Durée de période pluvieuse", - "abstract": "Période la plus longue où la précipitation est au-dessus d'un seuil." + "abstract": "Période la plus longue où la précipitation est au-dessus d'un seuil donné." }, "SDII": { - "long_name": "Indice simple de l'intensité des précipitations", - "description": "Indice simple d'intensité des précipitations {freq:m} [SDII]. Moyenne {freq:f} de la précipitation journalière pour les jours où la précipitation est au-dessus de {thresh}.", - "title": "Indice simple de l'intensité des précipitations", - "abstract": "Moyenne de la précipitation quotidienne pour les jours où la précipitation est au-dessus d'un seuil." + "long_name": "Moyenne de la précipitation quotidienne pour les jours où la précipitation est au-dessus de {thresh}. [Indice simple de l'intensité des précipitations: SDII]", + "description": "Indice simple d'intensité des précipitations {freq:m} [SDII]. Moyenne {freq:f} de la précipitation quotidienne pour les jours où la précipitation est au-dessus de {thresh}.", + "title": "Indice simple de l'intensité des précipitations [SDII]", + "abstract": "Moyenne de la précipitation quotidienne pour les jours où la précipitation est au-dessus d'un seuil donné." }, "PRCPTOT": { "long_name": "Précipitation totale", "description": "Précipitation totale {freq:f}.", "title": "Précipitation accumulée totale (liquide ou solide)", - "abstract": "Précipitation accumulée totale. Si la température journalière moyenne est donnée, le paramètre phase peut-être utilisé pour restreindre le calcul aux précipitations d'une seule phase (liquide ou solide). Les précipitations sont considérées solides si la température journalière moyenne est sous 0°C (et vice-versa)." + "abstract": "Précipitation accumulée totale. Si la température quotidienne moyenne est donnée, le paramètre phase peut-être utilisé pour restreindre le calcul aux précipitations d'une seule phase (liquide ou solide). Les précipitations sont considérées solides si la température quotidienne moyenne est sous 0°C (et vice-versa)." }, "WET_PRCPTOT": { - "long_name": "Précipitation totale lors de jours pluvieux", - "description": "Précipitation totale {freq:f} lorsque la précipitation journalière excède {thresh}.", - "title": "Précipitation accumulée totale lors de jours pluvieux", - "abstract": "Précipitation accumulée totale lors de jours pluvieux. Un jour est considéré pluvieux si la précipitation est supérieure ou égale à un seuil donné." + "long_name": "Précipitation totale lors de jours avec précipitation au-dessus de {thresh}", + "description": "Précipitation totale {freq:f} lorsque la précipitation quotidienne est au-dessus de {thresh}.", + "title": "Précipitation accumulée totale lors de jours avec précipitation", + "abstract": "Précipitation accumulée totale lors de jours avec précipitation. Un jour est considéré avec précipitation si la précipitation est au-dessus ou égale à un seuil donné." }, "LIQUIDPRCPTOT": { - "long_name": "Précipitation liquide totale", - "description": "Précipitation liquide totale {freq:f}, estimée comme la précipitation lorsque la température moyenne est >= 0°C.", + "long_name": "Précipitation totale lorsque la température moyenne est au-dessus de {thresh}", + "description": "Précipitation liquide totale {freq:f}, estimée comme la précipitation lorsque la température moyenne est au-dessus de {thresh}.", "title": "Précipitation liquide accumulée totale", - "abstract": "Précipitation liquide accumulée totale. Les précipitations sont considérées liquides lorsque la température journalière moyenne est au-dessus de 0°C." + "abstract": "Précipitation liquide accumulée totale. Les précipitations sont considérées liquides lorsque la température quotidienne moyenne est au-dessus de 0°C." }, "SOLIDPRCPTOT": { - "long_name": "Précipitation solide totale", - "description": "Précipitation solide totale {freq:f}, estimée comme la précipitation lorsque la température moyenne est < 0°C.", + "long_name": "Précipitation totale lorsque la température moyenne est sous ou égale à {thresh}", + "description": "Précipitation solide totale {freq:f}, estimée comme la précipitation lorsque la température moyenne est sous ou égale à {thresh}.", "title": "Précipitation solide accumulée totale", - "abstract": "Précipitation liquide accumulée totale. Les précipitations sont considérées liquides lorsque la température journalière moyenne est sous 0°C." + "abstract": "Précipitation solide accumulée totale. La précipitation est considéré solide lorsque la température quotidienne moyenne est sous ou égale à 0°C." }, "SPI": { "long_name": "Indice de précipitation standardisé (SPI)", - "description": "Précipitations sur une fenêtre mobile de {window} {freq:nom}, normalisées tel que la moyenne de SPI est 0 pour les données de calibration.", + "description": "Précipitation sur une fenêtre mobile de {window} {freq:nom}, normalisée telle que la moyenne du SPI est 0 pour les données de calibration. L'unité de la fenêtre 'X' est l'unité de temps déterminée par la fréquence de rééchantillonage,", "title": "Indice de précipitation standardisé (SPI)", - "abstract": "Précipitations sur une fenêtre mobile, normalisées tel que la moyenne de SPI est 0 pour les données de calibration. L'unité de la fenêtre est l'unité de temps déterminée par la fréquence de rééchantillonage" + "abstract": "Précipitation sur une fenêtre mobile, normalisée telle que la moyenne du SPI est 0 pour les données de calibration. L'unité de la fenêtre est l'unité de temps déterminée par la fréquence de rééchantillonnage." }, "SPEI": { "long_name": "Indice de précipitation évapotranspiration standardisé (SPEI)", - "description": "Budget d'eau (précipitation - évapotranspiration) sur une fenêtre mobile de {window} {freq:nom}, normalisé tel que la moyenne de SPEI est 0 pour les données de calibration.", + "description": "Budget d'eau (précipitation moins évapotranspiration) sur une fenêtre mobile de {window} {freq:nom}, normalisé tel que la moyenne du SPEI est 0 pour les données de calibration. L'unité de la fenêtre `X` est l'unité de temps determinée par la fréquence de rééchantillonnage {freq:f}.", "title": "Indice de précipitation évapotranspiration standardisé (SPEI)", - "abstract": "Budget d'eau (précipitation - évapotranspiration) sur une fenêtre mobile, normalisé tel que la moyenne de SPEI est 0 pour les données de calibration. L'unité de la fenêtre est l'unité de temps déterminée par la fréquence de rééchantillonage." + "abstract": "Budget d'eau (précipitation - évapotranspiration) sur une fenêtre mobile, normalisé tel que la moyenne du SPEI est 0 pour les données de calibration. L'unité de la fenêtre est l'unité de temps déterminée par la fréquence de rééchantillonnage." }, "DC": { "long_name": "Indice de sécheresse", - "description": "Code numérique estimant la teneur en humidité moyenne de couches organiques. Calculée avec la méthode de mise en route '{start_up_mode}'.", + "description": "Code numérique estimant la teneur en humidité moyenne des couches organiques.", "title": "Indice de sécheresse quotidien", "abstract": "L'indice de sécheresse fait partie du système canadien des Indices Forêt-Météo. C'est un code numérique estimant la teneur en humidité moyenne de couches organiques." }, "TN_DAYS_ABOVE": { - "long_name": "Nombre de jours avec Tmin > {thresh}", - "description": "Nombre {freq:m} de jours où la température journalière minimale est au-dessus de {thresh}.", - "title": "Nombre de jours avec Tmin au-dessus d'un certain seuil", - "abstract": "Nombre de jours où la température journalière minimale est au-dessus d'un seuil." + "long_name": "Nombre de jours ayant une température minimale quotidienne au-dessus de {thresh}", + "description": "Nombre {freq:m} de jours où la température minimale quotidienne est au-dessus de {thresh}.", + "title": "Nombre de jours ayant une température minimale quotidienne au-dessus d'un seuil donné", + "abstract": "Nombre de jours où la température minimale quotidienne est au-dessus d'un seuil donné." }, "TN_DAYS_BELOW": { - "long_name": "Nombre de jours avec Tmin < {thresh}", - "description": "Nombre {freq:m} de jours où la température journalière minimale est sous {thresh}.", - "title": "Nombre de jours avec Tmin sous un certain seuil", - "abstract": "Nombre de jours où la température journalière minimale est sous un seuil." + "long_name": "Nombre de jours ayant une température minimale quotidienne sous {thresh}", + "description": "Nombre {freq:m} de jours où la température minimale quotidienne est sous {thresh}.", + "title": "Nombre de jours ayant une température minimale quotidienne sous un seuil donné", + "abstract": "Nombre de jours où la température minimale quotidienne est sous un seuil donné." }, "TG_DAYS_ABOVE": { - "long_name": "Nombre de jours avec Tmoy > {thresh}", - "description": "Nombre {freq:m} de jours où la température journalière moyenne est au-dessus de {thresh}.", - "title": "Nombre de jours avec tmoy au-dessus d'un certain seuil", - "abstract": "Nombre de jours où la température journalière moyenne est au-dessus d'un seuil." + "long_name": "Nombre de jours ayant une température moyenne quotidienne au-dessus de {thresh}", + "description": "Nombre {freq:m} de jours où la température quotidienne moyenne est au-dessus de {thresh}.", + "title": "Nombre de jours ayant une température moyenne quotidienne au-dessus d'un seuil donné", + "abstract": "Nombre de jours où la température quotidienne moyenne est au-dessus d'un seuil donné." }, "TG_DAYS_BELOW": { - "long_name": "Nombre de jours avec Tmoy < {thresh}", - "description": "Nombre {freq:m} de jours où la température journalière moyenne est sous {thresh}.", - "title": "Nombre de jours avec tmoy sous un certain seuil", - "abstract": "Nombre de jours où la température journalière moyenne est sous un seuil." + "long_name": "Nombre de jours ayant une température moyenne quotidienne sous {thresh}", + "description": "Nombre {freq:m} de jours où la température quotidienne moyenne est sous {thresh}.", + "title": "Nombre de jours ayant une température moyenne quotidienne sous un seuil donné", + "abstract": "Nombre de jours où la température quotidienne moyenne est sous un seuil donné." }, "TX_DAYS_ABOVE": { - "long_name": "Nombre de jours avec Tmax > {thresh}", - "description": "Nombre {freq:m} de jours où la température journalière maximale est au-dessus de {thresh}.", - "title": "Nombre de jours avec Tmax au-dessus d'un certain seuil", - "abstract": "Nombre de jours où la température journalière maximale est au-dessus d'un seuil." + "long_name": "Nombre de jours ayant une température maximale quotidienne au-dessus de {thresh}", + "description": "Nombre {freq:m} de jours où la température maximale quotidienne est au-dessus de {thresh}.", + "title": "Nombre de jours ayant une température maximale quotidienne au-dessus d'un seuil donné", + "abstract": "Nombre de jours où la température maximale quotidienne est au-dessus d'un seuil donné." }, "TX_DAYS_BELOW": { - "long_name": "Nombre de jours avec Tmax < {thresh}", - "description": "Nombre {freq:m} de jours où la température journalière maximale est sous {thresh}.", - "title": "Nombre de jours avec Tmax sous un certain seuil", - "abstract": "Nombre de jours où la température journalière maximale est sous un seuil." + "long_name": "Nombre de jours ayant une température maximale quotidienne sous {thresh}", + "description": "Nombre {freq:m} de jours où la température maximale quotidienne est sous {thresh}.", + "title": "Nombre de jours ayant une température maximale quotidienne sous un seuil donné", + "abstract": "Nombre de jours où la température maximale quotidienne est sous un seuil donné." }, "TX_TN_DAYS_ABOVE": { - "long_name": "Nombre de jours avec Tmax > {thresh_tasmax} et Tmin > {thresh_tasmin}", - "description": "Nombre {freq:m} de jours où la température journalière maximale excède {thresh_tasmax} et la température journalière minimale excède {thresh_tasmin}.", - "title": "Nombre de jours avec des températures quotidiennes minimales et maximales chaudes", - "abstract": "Nombre de jours où les températures journalières maximales et minimales sont au-dessus de seuils donnés." + "long_name": "Nombre de jours ayant des températures minimales au-dessus {thresh_tasmin} et températures maximale quotidiennes au-dessus {thresh_tasmax}", + "description": "Nombre {freq:m} de jours où la température maximale quotidienne est au-dessus {thresh_tasmax} et la température minimale quotidienne est au-dessus {thresh_tasmin}.", + "title": "Nombre de jours ayant des températures minimale et maximale quotidiennes au-dessus de seuils donnés", + "abstract": "Nombre de jours où les températures maximale et minimale quotidiennes sont au-dessus de seuils donnés." }, "HEAT_WAVE_FREQUENCY": { - "long_name": "Nombre de vagues de chaleur (Tmin > {thresh_tasmin} et Tmax > {thresh_tasmax} pour {window} jours)", - "description": "Nombre {freq:m} de vagues de chaleur. Une vague de chaleur se produit lorsque les températures quotidiennes minimales et maximales excèdent {thresh_tasmin} et {thresh_tasmax}, respectivement, durant au moins {window} jours.", + "long_name": "Nombre de séries d'au moins {window} jours consécutifs ayant des températures minimales quotidiennes au-dessus {thresh_tasmin} et températures maximales quotidiennes au-dessus {thresh_tasmax}", + "description": "Nombre {freq:m} de vagues de chaleur. Une vague de chaleur se produit lorsque les températures minimale et maximale quotidiennes excèdent {thresh_tasmin} et {thresh_tasmax}, respectivement, durant au moins {window} jours.", "title": "Fréquence des vagues de chaleur", - "abstract": "Nombre de vagues de chaleur. Une vague de chaleur se produit lorsque les températures journalières minimales et maximales excèdent des seuils donnés durant un certain nombre de jours." + "abstract": "Nombre de vagues de chaleur. Une vague de chaleur se produit lorsque les températures minimale et maximale quotidiennes excèdent des seuils donnés durant un certain nombre de jours." + }, + "HEAT_WAVE_MAX_LENGTH": { + "long_name": "Série la plus longue d'au moins {window} jours consécutifs ayant des températures minimales quotidiennes au-dessus {thresh_tasmin} et températures maximales quotidiennes au-dessus {thresh_tasmax}", + "description": "Durée maximale {freq:f} des vagues de chaleur. Une vague de chaleur se produit lorsque les températures minimale et maximale quotidiennes excèdent {thresh_tasmin} et {thresh_tasmax}, respectivement, durant au moins {window} jours.", + "title": "Durée maximale des vagues de chaleur", + "abstract": "Durée maximale des vagues de chaleur. Une vague de chaleur se produit lorsque les températures minimale et maximale quotidiennes excèdent des seuils donnés durant un certain nombre de jours." }, "HEAT_WAVE_TOTAL_LENGTH": { - "long_name": "Durée totale des vagues de chaleur (Tmin > {thresh_tasmin} et Tmax > {thresh_tasmax} pour >= {window} days)", - "description": "Durée totale {freq:f} des vagues de chaleur. Une vague de chaleur se produit lorsque les températures quotidiennes minimales et maximales excèdent {thresh_tasmin} et {thresh_tasmax}, respectivement, durant au moins {window} jours.", + "long_name": "Durée totale des événements d'au moins {window} jours consécutifs ayant des températures minimales quotidiennes au-dessus {thresh_tasmin} et températures maximales quotidiennes au-dessus {thresh_tasmax}", + "description": "Durée totale {freq:f} des vagues de chaleur en somme de jours. Une vague de chaleur se produit lorsque les températures minimale et maximale quotidiennes excèdent {thresh_tasmin} et {thresh_tasmax}, respectivement, durant au moins {window} jours.", "title": "Durée totale des vagues de chaleur", - "abstract": "Durée totale des vagues de chaleur. Une vague de chaleur se produit lorsque les températures journalières minimales et maximales excèdent des seuils donnés durant un certain nombre de jours." - }, - "HEAT_WAVE_MAX_LENGTH": { - "long_name": "Longueur maximale des vagues de chaleur (Tmin > {thresh_tasmin} et Tmax > {thresh_tasmax} pour {window} jours au moins)", - "description": "Longueur maximale {freq:f} des vagues de chaleur. Une vague de chaleur se produit lorsque les températures quotidiennes minimales et maximales excèdent {thresh_tasmin} et {thresh_tasmax}, respectivement, durant au moins {window} jours.", - "title": "Longueur maximale des vagues de chaleur", - "abstract": "Longueur maximale des vagues de chaleur. Une vague de chaleur se produit lorsque les températures journalières minimales et maximales excèdent des seuils donnés durant un certain nombre de jours." + "abstract": "Durée totale des vagues de chaleur en somme de jours. Une vague de chaleur se produit lorsque les températures minimale et maximale quotidiennes excèdent des seuils donnés durant un certain nombre de jours." }, "HEAT_WAVE_INDEX": { - "long_name": "Nombre de jours de vague de chaleur", - "description": "Nombre {freq:m} de jours de vague de chaleur, définie comme cinq jours consécutifs ou plus où la température est au-dessus de {thresh}.", + "long_name": "Nombre total de jours constituant des événements d'au moins {window} jours consécutifs ayant une température maximale quotidienne au-dessus {thresh}", + "description": "Nombre {freq:m} de jours de vague de chaleur. Une vague de chaleur se produit lorsque la température maximale quotidienne excède {thresh} durant au moins {window} jours.", "title": "Indice de vague de chaleur", - "abstract": "Nombre de jours de vagues de chaleur. Une vague de chaleur se produit lorsque la température journalière maximale excède un seuil durant au moins 5 jours." + "abstract": "Nombre de jours de vagues de chaleur. Une vague de chaleur se produit lorsque la température maximale quotidienne excède un seuil donné durant un certain nombre de jours." }, "TG": { - "long_name": "température journalière moyenne", - "description": "température journalière moyenne estimée par la médiane des températures maximales et minimales.", - "title": "Moyenne des températures maximales et minimales", - "abstract": "La température journalière moyenne en assumant une distribution symétrique des températures. Tg = (Tx + Tn) / 2" + "long_name": "Moyenne des températures maximale et minimale quotidennes", + "description": "Température moyenne quotidienne moyenne estimée par la moyenne des températures maximale et minimale quotidiennnes.", + "title": "Température moyenne", + "abstract": "La température moyenne quotidienne en supposant une distribution symétrique des températures maximale et minimale quotidiennes (Tg = (Tx + Tn) / 2)." }, "TG_MIN": { - "long_name": "Minimum de la température journalière moyenne", - "description": "Minimum {freq:m} de la température journalière moyenne.", - "title": "Minimum de la température journalière moyenne", - "abstract": "Minimum de la température journalière moyenne." + "long_name": "Minimum de la température moyenne quotidienne", + "description": "Minimum {freq:m} de la température moyenne quotidienne.", + "title": "Minimum de la température moyenne", + "abstract": "Minimum de la température moyenne quotidienne." }, "TG_MAX": { - "long_name": "Maximum de la température journalière moyenne", - "description": "Maximum {freq:m} de la température journalière moyenne.", - "title": "Maximum de la température journalière moyenne", - "abstract": "Maximum de la température journalière moyenne." + "long_name": "Maximum de la température moyenne quotidienne", + "description": "Maximum {freq:m} de la température moyenne quotidienne.", + "title": "Maximum de la température moyenne", + "abstract": "Maximum de la température moyenne quotidienne." }, "TG_MEAN": { - "long_name": "Moyenne de la température journalière", - "description": "Moyenne {freq:f} de la température journalière.", - "title": "Température journalière moyenne", - "abstract": "Température journalière moyenne." + "long_name": "Moyenne de la température moyenne quotidienne", + "description": "Moyenne {freq:f} de la température quotidienne.", + "title": "Température moyenne", + "abstract": "Moyenne de la température moyenne quotidienne." }, "TG10P": { - "long_name": "Nombre de jours où la température est au-dessus du {per_base_thresh}e percentile", - "description": "Nombre {freq:m} de jours où la température est au-dessus du {per_base_thresh}e percentile. Le {per_base_thresh}e percentile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", - "title": "Nombre de jours où la température est au-dessus du {per_base_thresh}e percentile", - "abstract": "Nombre de jours où la température est au-dessus du {per_base_thresh}e percentile" + "long_name": "Nombre de jours ayant une température moyenne quotidienne sous le 10ᵉ centile", + "description": "Nombre {freq:m} de jours où la température moyenne est sous le {per_base_thresh}ᵉ centile. Le {per_base_thresh}ᵉ centile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", + "title": "Nombre de jours ayant une température moyenne quotidienne sous le 10ᵉ centile", + "abstract": "Nombre de jours où la température moyenne quotidienne est sous le 10ᵉ centile." }, "TG90P": { - "long_name": "Nombre de jours où la température est au-dessus du {per_base_thresh}e percentile", - "description": "Nombre {freq:m} de jours où la température est au-dessus du {per_base_thresh}e percentile. Le {per_base_thresh}e percentile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", - "title": "Nombre de jours où la température est au-dessus du {per_base_thresh}e percentile", - "abstract": "Nombre de jours où la température est au-dessus du {per_base_thresh}e percentile." + "long_name": "Nombre de jours ayant une température moyenne quotidienne au-dessus du 90ᵉ centile", + "description": "Nombre {freq:m} de jours où la température est au-dessus du {per_base_thresh}ᵉ centile. Le {per_base_thresh}ᵉ centile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", + "title": "Nombre de jours ayant une température moyenne quotidienne au-dessus du 90ᵉ centile", + "abstract": "Nombre de jours où la température moyenne quotidienne est au-dessus du 90ᵉ centile." }, "TN_MIN": { - "long_name": "Minimum de la température journalière", - "description": "Minimum {freq:m} de la température journalière minimale.", - "title": "Température journalière minimale", - "abstract": "Température journalière minimale." + "long_name": "Minimum de la température minimale quotidienne", + "description": "Minimum {freq:m} de la température minimale quotidienne.", + "title": "Température minimale", + "abstract": "Minimum de la température minimale quotidienne." }, "TN_MAX": { - "long_name": "Maximum de la température journalière minimale", - "description": "Maximum {freq:m} de la température journalière minimale.", + "long_name": "Maximum de la température minimale quotidienne", + "description": "Maximum {freq:m} de la température minimale quotidienne.", "title": "Maximum de la température minimale", - "abstract": "Maximum de la température journalière minimale." + "abstract": "Maximum de la température minimale quotidienne." }, "TN_MEAN": { - "long_name": "Moyenne de la température journalière minimale", - "description": "Moyenne {freq:f} de la température journalière minimale.", + "long_name": "Moyenne de la température minimale quotidienne", + "description": "Moyenne {freq:f} de la température minimale quotidienne.", "title": "Moyenne de la température minimale", - "abstract": "Moyenne de la température journalière minimale." + "abstract": "Moyenne de la température minimale quotidienne." }, "TN10P": { - "long_name": "Nombre de jours où la température minimale est en dessous du {per_base_thresh}e percentile", - "description": "Nombre {freq:m} de jours où la température minimale est en dessous du {per_base_thresh}e percentile. Le {per_base_thresh}e percentile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", - "title": "Nombre de jours où la température minimale est en dessous du {per_base_thresh}e percentile", - "abstract": "Nombre de jours où la température minimale est en dessous du {per_base_thresh}e percentile." + "long_name": "Nombre de jours ayant une température minimale sous le 10ᵉ centile", + "description": "Nombre {freq:m} de jours où la température minimale est sous le {per_base_thresh}ᵉ centile. Le {per_base_thresh}ᵉ centile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", + "title": "Nombre de jours ayant une température minimale sous le 10ᵉ centile", + "abstract": "Nombre de jours où la température minimale est sous le 10ᵉ centile." }, "TN90P": { - "long_name": "Nombre de jours où la température minimale est au-dessus du {per_base_thresh}e percentile", - "description": "Nombre {freq:m} de jours où la température minimale est au-dessus du {per_base_thresh}e percentile. Le {per_base_thresh}e percentile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", - "title": "Nombre de jours où la température minimale est au-dessus du {per_base_thresh}e percentile", - "abstract": "Nombre de jours où la température minimale est au-dessus du {per_base_thresh}e percentile." + "long_name": "Nombre de jours ayant une température minimale au-dessus du 90ᵉ centile", + "description": "Nombre {freq:m} de jours où la température minimale est au-dessus du {per_base_thresh}ᵉ centile. Le {per_base_thresh}ᵉ centile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", + "title": "Nombre de jours ayant une température minimale au-dessus du 90ᵉ centile", + "abstract": "Nombre de jours où la température minimale est au-dessus du 90ᵉ centile." }, "TX_MIN": { - "long_name": "Minimum de la température journalière maximale", - "description": "Minimum {freq:m} de la température journalière maximale.", + "long_name": "Minimum de la température maximale quotidienne", + "description": "Minimum {freq:m} de la température maximale quotidienne.", "title": "Minimum de la température maximale", - "abstract": "Minimum de la température journalière maximale." + "abstract": "Minimum de la température maximale quotidienne." }, "TX_MAX": { - "long_name": "Maximum de la température journalière", - "description": "Maximum {freq:m} de la température journalière maximale.", - "title": "Température journalière maximale", - "abstract": "Température journalière maximale." + "long_name": "Maximum de la température quotidienne", + "description": "Maximum {freq:m} de la température maximale quotidienne.", + "title": "Température maximale", + "abstract": "Maximum de la température maximale quotidienne." }, "TX_MEAN": { - "long_name": "Moyenne de la température journalière maximale", - "description": "Moyenne {freq:f} de la température journalière maximale.", + "long_name": "Moyenne de la température maximale quotidienne", + "description": "Moyenne {freq:f} de la température maximale quotidienne.", "title": "Moyenne de la température maximale", - "abstract": "Moyenne de la température journalière maximale." + "abstract": "Moyenne de la température maximale quotidienne." }, "TX10P": { - "long_name": "Nombre de jours où la température maximale est en dessous du {per_base_thresh}e percentile", - "description": "Nombre {freq:m} de jours où la température maximale est en dessous du {per_base_thresh}e percentile. Le {per_base_thresh}e percentile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", - "title": "Nombre de jours où la température maximale est en dessous du {per_base_thresh}e percentile", - "abstract": "Nombre de jours où la température maximale est en dessous du {per_base_thresh}e percentile." + "long_name": "Nombre de jours ayant une température maximale sous le 10ᵉ centile", + "description": "Nombre {freq:m} de jours où la température maximale est en dessous du {per_base_thresh}ᵉ centile. Le {per_base_thresh}ᵉ centile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", + "title": "Nombre de jours ayant une température maximale sous le 10ᵉ centile", + "abstract": "Nombre de jours où la température maximale est sous le 10ᵉ centile." }, "TX90P": { - "long_name": "Nombre de jours où la température maximale est au-dessus du {per_base_thresh}e percentile", - "description": "Nombre {freq:m} de jours où la température maximale est au-dessus du {per_base_thresh}e percentile. Le {per_base_thresh}e percentile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", - "title": "Nombre de jours où la température maximale est au-dessus du {per_base_thresh}e percentile", - "abstract": "Nombre de jours où la température maximale est au-dessus du {per_base_thresh}e percentile." + "long_name": "Nombre de jours ayant une température maximale au-dessus du 90ᵉ centile", + "description": "Nombre {freq:m} de jours où la température maximale est au-dessus du {per_base_thresh}ᵉ centile. Le {per_base_thresh}ᵉ centile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", + "title": "Nombre de jours ayant la température maximale au-dessus du 90ᵉ centile", + "abstract": "Nombre de jours où la température maximale est au-dessus du 90ᵉ centile." }, "DTRMAX": { "long_name": "Amplitude diurne maximale de la température", "description": "Maximum {freq:m} de l'amplitude diurne de la température.", "title": "Amplitude diurne maximale de la température", - "abstract": "L'écart maximal entre les températures journalières maximale et minimale." + "abstract": "L'écart maximal entre les températures maximale et minimale quotidiennes." }, "DTR": { "long_name": "Amplitude diurne de la température", "description": "Moyenne {freq:f} de l'amplitude diurne de la température.", "title": "Amplitude diurne de la température", - "abstract": "La différence moyenne entre les températures journalières maximale et minimale." + "abstract": "La différence moyenne entre les températures maximale et minimale quotidiennes." }, "DTRVAR": { "long_name": "Variabilité de l'amplitude diurne de la température", - "description": "Variation interdiurne moyenne {freq:f} de l'amplitude diurne de la température.", + "description": "Variation interdiurne moyenne {freq:f} de l'amplitude diurne de la température, définie comme la variation quotidienne moyenne de l'amplitude diurne des températures quotidiennes pour une période donnée.", "title": "Variation interdiurne moyenne de l'amplitude diurne de la température", "abstract": "Variation interdiurne moyenne de l'amplitude diurne de la température." }, "ETR": { "long_name": "Amplitude des températures extrêmes", - "description": "Calcul {freq:m} de l'intervalle entre le maximum de la température journalière maximale et le minimum de la température journalière minimale.", - "title": "Intervalle des températures extrêmes", + "description": "Calcul {freq:m} de l'intervalle entre le maximum de la température maximale quotidienne et le minimum de la température minimale quotidienne.", + "title": "Amplitude des températures extrêmes", "abstract": "Le maximum de la température maximale moins le minimum de la température minimale." }, "COLD_SPELL_DURATION_INDEX": { - "long_name": "Indice de durée des vagues de froid", - "description": "Nombre {freq:m} de jours de vague de froid. Une vague de froid se produit lorsque la température journalière minimale est sous le {per_base_thresh} percentile durant au moins {window} jours consécutifs. Le {per_base_thresh} percentile est calculé à partir d'une fenêtre de {per_window} jours centrée sur chaque jour du calendrier à l'intérieur d'une période de référence.", - "title": "Indice de durée des vagues de froid", - "abstract": "Nombre de jours de vagues de froid. Une vague de froid se produit lorsque la température journalière minimale est sous le {per_base_thresh} percentile durant au moins {window} nombre de jours consécutifs." + "long_name": "Nombre total de jours constituant des événements d'au moins {window} jours consécutifs où la température minimale quotidienne est en dessous du {tasmin_per_thresh}ᵉ percentile", + "description": "{freq:m} nombre de jours avec au moins {window} jours consécutifs où la température minimale quotidienne est sous le {tasmin_per_thresh}ᵉ centile. Une vague de froid se produit lorsque la température minimale quotidienne est sous un centile donné pendant au moins {window} jours consécutifs.", + "title": "Indice de durée des vagues de froid [CSDI]", + "abstract": "Nombre de jours de vagues de froid. Une vague de froid se produit lorsque la température minimale quotidienne est sous un centile donné pendant au moins {window} jours consécutifs." }, "COLD_SPELL_FREQUENCY": { - "long_name": "Nombre de vagues de froid", - "description": "Nombre {freq:m} de vagues de froid. Une vague de froid se produit lorsque la température journalière minimale est sous {thresh} durant au moins {window} jours consécutifs.", + "long_name": "Nombre total de séries d'au moins {window} jours consécutifs où la température quotidienne moyenne est sous {thresh}.", + "description": "Nombre {freq:m} de vagues de froid. Une vague de froid se produit lorsque la température minimale quotidienne est sous {thresh} durant au moins {window} jours consécutifs.", "title": "Nombre de vagues de froid", - "abstract": "Nombre de vagues de froid. Une vague de froid se produit lorsque la température journalière minimale est sous un seuil durant au moins un certain nombre de jours consécutifs." + "abstract": "Nombre de vagues de froid. Une vague de froid se produit lorsque la température minimale quotidienne est sous un seuil durant au moins un certain nombre de jours consécutifs." }, "COLD_SPELL_DAYS": { - "long_name": "Jours de vagues de froid", - "description": "Nombre {freq:m} de jours de vague de froid. Une vague de froid se produit lorsque la température journalière minimale est sous {thresh} durant au moins {window} jours consécutifs.", - "title": "Jours de vague de froid", - "abstract": "Nombre de jours de vagues de froid. Une vague de froid se produit lorsque la température journalière minimale est sous un seuil durant au moins un certain nombre de jours consécutifs." + "long_name": "Nombre total de jours constituant des événements d'au moins {window} jours consécutifs où la température quotidienne moyenne est sous {thresh}", + "description": "Nombre {freq:m} de jours faisant partie d'une vague de froid. Une vague de froid se produit lorsque la température minimale quotidienne est sous {thresh} durant au moins {window} jours consécutifs.", + "title": "Nombre de jours faisant partie d'une vague de froid", + "abstract": "Nombre de jours faisant partie d'une vague de froid. Une vague de froid se produit lorsque la température minimale quotidienne est sous un seuil donné durant au moins un certain nombre de jours consécutifs." }, "COOL_NIGHT_INDEX": { "long_name": "Indice de fraîcheur des nuits", - "description": "Moyenne {freq:f} de la température journalière minimale en septembre (hémisphère nord) ou en mars (hémisphère sud).", + "description": "Moyenne {freq:f} de la température minimale quotidienne en septembre (hémisphère nord) ou en mars (hémisphère sud).", "title": "Indice de fraîcheur des nuits", - "comment": "Formule prise de Tonietto & Carbonneau, 2004 (10.1016/j.agrformet.2003.06.001).", "abstract": "Indicateur des conditions nycthermiques de maturation, qui correspond à la valeur moyenne de la température minimale de l'air sur les 30 jours précédant la date de récolte potentielle." }, "DLYFRZTHW": { - "long_name": "Cycles de gel-dégel", - "description": "Nombre {freq:m} de jours avec un gel-dégel quotidien : Tmax > {thresh_tasmax} et Tmin <= {thresh_tasmin}.", - "title": "Nombre de jours avec un cycle de gel-dégel", - "abstract": "Le nombre de jours où Tmax est au-dessus d'un seuil et Tmin en dessous d'un seuil, habituellement 0 °C pour les deux." + "long_name": "Nombre de jours où les températures maximales quotidiennes sont au-dessus de {thresh_tasmax} et les températures minimales quotidiennes sont en dessous ou égales à {thresh_tasmin})", + "description": "Nombre {freq} de jours avec un cycle diurne de gel-dégel, où les températures maximales quotidiennes sont au-dessus de {thresh_tasmax} et les températures minimales quotidiennes sont en dessous ou égales à {thresh_tasmin}.", + "title": "Cycles de gel-dégel", + "abstract": "Le nombre de jours avec un cycle de gel-dégel. Un cycle de gel-dégel est défini comme un jour où la température maximale quotidienne est au-dessus d'un seuil donné et où la température minimale quotidienne est en dessous ou égale à un seuil, généralement 0°C pour les deux.." }, "COOLING_DEGREE_DAYS": { - "long_name": "Degrés-jours de climatisation (Tmoy > {thresh})", - "description": "Cumul {freq:m} des degrés-jours de climatisation (Température au-dessus de {thresh}).", + "long_name": "Somme cumulée des degrés de température pour la température moyenne quotidienne au-dessus de {thresh}", + "description": "Cumul {freq:m} des degrés-jours de climatisation (température moyenne quotidienne au-dessus de {thresh}).", "title": "Degrés-jours de climatisation", - "abstract": "Cumul des degrés-jours pour les jours où la température moyenne est au-dessus d'un seuil et que les immeubles doivent être réfrigérés." + "abstract": "Cumul des degrés-jours pour les jours où la température moyenne quotidienne est au-dessus d'un seuil donné et que les immeubles doivent être climatisés." }, "HEATING_DEGREE_DAYS": { - "long_name": "Degrés-jours de chauffage (Tmoy < {thresh})", - "description": "Cumul {freq:m} des degrés-jours de chauffage (Température en dessous de {thresh}).", + "long_name": "Somme cumulée des degrés de température pour la température moyenne quotidienne sous {thresh}", + "description": "Cumul {freq:m} des degrés-jours de chauffage (température moyenne quotidienne sous {thresh}).", "title": "Degrés-jours de chauffage", - "abstract": "Cumul des degrés-jours pour les jours où la température moyenne est sous un seuil et que les immeubles doivent être chauffés." + "abstract": "Cumul des degrés-jours pour les jours où la température moyenne est sous un seuil donné et que les immeubles doivent être chauffés." }, "GROWING_DEGREE_DAYS": { - "long_name": "Degrés-jours de croissance (Tmoy > {thresh})", - "description": "Cumul {freq} des degrés-jours de croissance (Température au-dessus de {thresh}).", + "long_name": "Somme cumulée des degrés de température pour la température moyenne quotidienne au-dessus de {thresh}", + "description": "Cumul {freq:m} des degrés-jours de croissance (température moyenne quotidienne au-dessus de {thresh}).", "title": "Degrés-jours de croissance", - "abstract": "Cumul des degrés-jours pour les jours où la température moyenne est au-dessus d'un seuil." + "abstract": "Cumul des degrés-jours pour les jours où la température moyenne quotidienne est au-dessus d'un seuil donné." }, "FREEZING_DEGREE_DAYS": { - "long_name": "Degrés-jours de gel (Tmoy < {thresh})", - "description": "Cumul {freq:m} des degrés-jours de gel (Température en dessous de {thresh}).", + "long_name": "Somme cumulée des degrés de température pour la température moyenne quotidienne sous {thresh}", + "description": "Cumul {freq:m} des degrés-jours de gel (température moyenne quotidienne sous {thresh}).", "title": "Degrés-jours de gel", - "abstract": "Cumul des degrés-jours pour les jours où la température moyenne est sous un seuil." + "abstract": "Cumul des degrés-jours pour les jours où la température moyenne quotidienne est sous un seuil donné, habituellement 0°C." }, "THAWING_DEGREE_DAYS": { - "long_name": "Degrés-jours de dégel (Tmoy > {thresh})", - "description": "Cumul {freq} des degrés-jours de dégel (Température au-dessus de {thresh}).", + "long_name": "Somme cumulée des degrés de température pour la température moyenne quotidienne au-dessus de {thresh}", + "description": "Cumul {freq:m} des degrés-jours de dégel (température moyenne quotidienne au-dessus de {thresh}).", "title": "Degrés-jours de dégel", - "abstract": "Cumul des degrés-jours pour les jours où la température moyenne est au-dessus d'un seuil." + "abstract": "Cumul des degrés-jours pour les jours où la température moyenne quotidienne est au-dessus d'un seuil donné, habituellement 0°C." }, "BIOLOGICALLY_EFFECTIVE_DEGREE_DAYS": { - "long_name": "Degrés-jours biologiquement actifs", - "description": "Accumulation des degrés-jours borné par Tmin > {thresh_tasmin} et Tmax-Tmin < {max_daily_degree_days}. Les degrés jours quotidiens sont corrigés selon Tmax-Tmin et selon un coefficient de longueur du jour dépendent de la latitude.", + "long_name": "Intégrale de la température moyenne quotidienne au-dessus de {thresh_tasmin}, avec une valeur maximale de {max_daily_degree_days}, multipliée par un coefficient de longueur de jour et un modificateur de plage de température basé sur la méthode {method} pour les jours compris entre {start_date} et {end_date}", + "description": "Cumul des degrés-jours borné par la température minimale quotidienne sous {thresh_tasmin} et la différence entre les températures maximale et minimale quotiennes sous {max_daily_degree_days} . Les degrés jours quotidiens sont corrigés selon la différence entre les températures maximale et minimale quotiennes et selon un coefficient de durée du jour `k` dépendant de la latitude et le coefficient `TR_adj` est un modificateur qui tient compte des grandes variations de température.", "title": "Degrés-jours biologiquement actifs", "comment": "Formule originale prise de Gladstones 1992.", - "abstract": "Indice basé sur une relation non linéaire entre la température et les processus physiologiques. Il intègre une borne supérieure du cumul, un coefficient lié à la longueur du jour et une correction liée à l'écart journalier des températures." + "abstract": "Prend en compte les températures minimales et maximales quotidiennes avec un seuil de base donné entre le 1er avril et le 31 octobre, avec une valeur quotidienne maximale pour les degrés-jours cumulés (généralement 9°C), et intègre des coefficients de modification pour les latitudes comprises entre 40°N et 50°N ainsi que pour les variations de l'amplitude thermique quotidienne." }, "EFFECTIVE_GROWING_DEGREE_DAYS": { - "long_name": "Degrés-jours effectives", - "description": "Accumulation des degrés-jours borné par (Tmax + Tmin)/2 > {thresh} et des dates de début et fin de la saison de croissance generés dynamiquement.", - "title": "Degrés-jours effectives", + "long_name": "Intégrale de la température journalière moyenne supérieure à {thresh} pour les jours compris entre les dates de début et de fin déterminées dynamiquement à l'aide de la méthode {method}", + "description": "Indice de sommation de chaleur pour l'estimation de l'adéquation agroclimatique. Calculé avec la formule {method} (Somme de max((Tn + Tx)/2 - {thresh}, 0) entre les dates de début et de fin de saison de croissance déterminées dynamiquement. La méthode `bootsma` utilise une température moyenne sur 10 jours au-dessus de {thresh} pour identifier une date de début, tandis que la méthode `qian` utilise une moyenne pondérée au-dessus de {thresh} sur 5 jours pour déterminer la date de début. La date de fin de la saison de croissance est la date de la première gelée d'automne (Tn < 0°C) survenant après {after_date}.", + "title": "Degrés-jours de croissance effectifs", "comment": "Formule originale prise de Bootsma et al. 2005.", - "abstract": "Indice de degrés-jours de croissance basés sur un début et une fin dynamiques de la saison de croissance." + "abstract": "Considère la température minimale et maximale quotidienne avec un seuil de base donné entre les dates de début et de fin de saison de croissance déterminées dynamiquement. La méthode `bootsma` utilise une température moyenne sur 10 jours au-dessus d'un seuil donné pour identifier une date de début, tandis que la méthode `qian` utilise une température moyenne pondérée au-dessus d'un seuil donné sur 5 jours pour déterminer la date de début. La date de fin de la saison de croissance est la date de la première gelée d'automne (Tn < 0°C) survenant après une date donnée (généralement le 1er juillet)." }, "LATITUDE_TEMPERATURE_INDEX": { - "long_name": "Indice latitude-température", - "description": "Température moyenne du mois le plus chaud avec un facteur d'échelle basé sur la latitude : Moyenne de température du mois le plus chaud * ({lat_factor} - latitude).", + "long_name": "Température moyenne du mois le plus chaud multipliée par la différence de {lat_factor} moins la latitude", + "description": "Température moyenne du mois le plus chaud avec un facteur d'échelle basé sur la latitude. Température moyenne du mois le plus chaud multipliée par la différence de {lat_factor} moins la latitude.", "title": "Indice de latitude-température", "comment": "Formule originale prise de Jackson, D. I., & Cherry, N. J. (1988)", - "abstract": "indice climatique basé sur la température moyenne du mois le plus chaud et un coefficient basé sur la latitude pour tenir compte de la durée plus longue du jour favorisant les conditions de croissance. Développé spécifiquement pour la viticulture." + "abstract": "Indice climatique basé sur la température moyenne du mois le plus chaud et un coefficient basé sur la latitude pour tenir compte de la durée plus longue du jour favorisant les conditions de croissance. Développé spécifiquement pour la viticulture. Température moyenne du mois le plus chaud multipliée par la différence de coéffient de facteur latitude moins la latitude." + }, + "HUGLIN_INDEX": { + "long_name": "Intégrale de la température moyenne quotidienne au-dessus de {thresh} multipliée par le coefficient de longueur du jour du méthode {method} pour les jours compris entre {start_date} et {end_date}", + "description": "Indice de sommation de chaleur pour l'estimation de l'adéquation agroclimatique, développé spécifiquement pour la viticulture. Calculé avec la formule {méthode} (Somme de ((Tn + Tx)/2 - {thresh}) * k), où le coefficient (`k`) est une longueur de jour basée sur la latitude pour les jours typiquement compris entre {start_date} et {end_date}.", + "title": "Indice héliothermique de Huglin", + "abstract": "Indice de sommation de chaleur pour l'estimation de l'adéquation agroclimatique, développé spécifiquement pour la viticulture. Il prend en compte les temperature minimales et maximales quotidiennes avec un seuil de base donné, généralement entre le 1er avril et le 30 septembre, et intègre un calcul de coefficient de longueur de jour pour les latitudes plus élevées. Métrique initialement publiée dans Huglin (1978). Le coefficient de longueur du jour est basé sur Hall & Jones (2010)." }, "FRESHET_START": { - "long_name": "Jour de l'année du début de la crue nivale", - "description": "Jour de l'année du début de la crue nivale, défini comme le {window}e jour consécutif où la température excède {thresh}.", - "title": "Nième jour consécutif où la température excède un seuil", - "abstract": "Premier jour où la température excède un certain seuil depuis un certain nombre de jours consécutifs." + "long_name": "Premier jour où le seuil de température de {thresh} est dépassé pendant au moins {windows} jours", + "description": "Jour de l'année du début de la crue printanière, défini comme le premier jour la température moyenne quotidienne est au-dessus de {thresh} pendant au moins {window} jours.", + "title": "Jour de l'année du début de la crue printanière", + "abstract": "Jour de l'année du début de la crue printanière, défini comme le premier jour où la température moyenne quotidienne est au-dessus d'un seuil donné depuis un certain nombre de jours consécutifs." }, "FROST_SEASON_LENGTH": { - "long_name": "Durée de la saison de gel (Tmin < 0°C)", - "description": "Durée de la saison de gel, définie comme la période où Tmin est sous 0°C sans redoux de {window} jours ou plus.", + "long_name": "Nombre de jours entre la première occurrence d'au moins {fenêtre} jours consécutifs avec une température minimale quotidienne en dessous de {thresh} et la première occurrence d'au moins {window} jours consécutifs ayant une température minimale quotidienne au-dessus ou égale à {thresh} après {mid_date}", + "description": "Nombre {freq:m} de jours entre la première occurrence d'au moins {window} jours consécutifs ayant une température minimale quotidienne sous {thresh} et la première occurrence d'au moins {window} jours consécutifs ayant une température minimale quotidienne au-dessus ou égale à {thresh} après {mid_date}.", "title": "Durée de la saison de gel", - "abstract": "Durée de la saison de gel, définie comme la période où Tmin est sous 0°C sans redoux de {window} jours ou plus." + "abstract": "Durée de la saison de gel, définie comme la période pendant laquelle la température minimale quotidienne est inférieure à 0°C sans fenêtre de dégel de plusieurs jours, le dégel se produisant après une date du calendrier médiane." }, "FROST_DAYS": { - "long_name": "Nombre de jours de gel (Tmin < {thresh})", - "description": "Nombre {freq:m} de jours où la température journalière minimale est sous {thresh}.", + "long_name": "Nombre de jours où la température minimale quotidienne est sous {thresh}", + "description": "Nombre {freq:m} de jours où la température minimale quotidienne est sous {thresh}.", "title": "Nombre de jours de gel", - "abstract": "Nombre de jours où la température journalière minimale est sous un seuil." + "abstract": "Nombre de jours où la température minimale quotidienne est sous un seuil donné." }, "ICE_DAYS": { - "long_name": "Nombre de jours de glace (Tmax < {thresh})", - "description": "Nombre {freq:m} de jours où la température journalière maximale est sous {thresh}.", + "long_name": "Nombre de jours où la température maximale quotidienne est sous {thresh}.", + "description": "Nombre {freq:m} de jours où la température maximale quotidienne est sous {thresh}.", "title": "Nombre de jours de glace", - "abstract": "Nombre de jours où la température journalière maximale est sous un seuil." + "abstract": "Nombre de jours où la température maximale quotidienne est sous 0°C." }, "CONSECUTIVE_FROST_DAYS": { - "long_name": "Durée maximale des périodes de gel (Tmin < 0°C)", - "description": "Durée maximale {freq:f} des périodes où la température journalière minimale est sous 0°C.", - "title": "Durée maximale des périodes de gel (Tmin < 0°C)", - "abstract": "Durée maximale des périodes consécutives où la température journalière minimale est sous 0°C." + "long_name": "Nombre maximal de jours consécutifs où la température minimale quotidienne est en dessous de {thresh}", + "description": "Durée maximale {freq:f} des périodes où la température minimale quotidienne est sous {thresh}.", + "title": "Nombre maximal de jours de gel consécutifs", + "abstract": "Durée maximale des périodes consécutives où la température minimale quotidienne est sous un seuil donné." }, "FROST_FREE_SEASON_LENGTH": { - "long_name": "Durée de la saison sans gel", - "description": "Nombre {freq:m} de jours entre la première occurrence d'au moins {window} jours consécutifs où la température journalière moyenne dépasse {thresh} et la première occurrence (après le {mid_date}) d'au moins {window} jours consécutifs où la température est sous {thresh}.", + "long_name": "Nombre de jours entre la première occurrence d'au moins {window} jours consécutifs ayant une température minimale quotidienne au-dessus ou égale à {thresh} et la première occurrence d'au moins {window} jours consécutifs ayant une température minimale quotidienne sous {thresh} après {mid_date}", + "description": "Nombre {freq:m} de jours entre la première occurrence d'au moins {window} jours consécutifs ayant une température minimale quotidienne au-dessus ou égale à {thresh} et la première occurrence d'au moins {window} jours consécutifs ayant une température minimale quotidienne sous {thresh} après {mid_date}.", "title": "Durée de la saison sans gel", - "abstract": "Nombre de jours entre la première série de N jours avec des températures journalières moyennes au-dessus d'un seuil et la première série de N jours avec des températures journalières moyennes sous ce même seuil." + "abstract": "Durée de la saison sans gel, définie comme la période pendant laquelle la température minimale quotidienne est au-dessus de 0°C sans fenêtre de gel de plusieurs jours, le gel se produisant après une date du calendrier médiane." }, "FROST_FREE_SEASON_START": { - "long_name": "Jour de l'année du début de la saison sans gel", - "description": "Jour de l'année du début de la saison sans gel, défini comme le {window}e jour consécutif où la température excède {thresh}.", - "title": "Nième jour consécutif où la température excède un seuil", - "abstract": "Premier jour où la température excède un certain seuil depuis un certain nombre de jours consécutifs." + "long_name": "Premier jour suivant une période de {window} jours ayant une température minimale quotidienne au-dessus ou égale à {thresh}", + "description": "Jour de l'année du début de la saison sans gel, défini comme le {window}e jour consécutif où la température minimale quotidienne est au-dessus {thresh}.", + "title": "Jour de l'année du début de la saison sans gel", + "abstract": "Premier jour où la température minimale quotidienne est au-dessus un seuil donné depuis un certain nombre de jours consécutifs." }, "GROWING_SEASON_LENGTH": { - "long_name": "Durée de la saison de croissance", - "description": "Nombre {freq:m} de jours entre la première occurrence d'au moins {window} jours consécutifs où la température journalière moyenne dépasse {thresh} et la première occurrence (après le {mid_date}) d'au moins {window} jours consécutifs où la température est sous {thresh}.", + "long_name": "Nombre de jours entre la première occurrence d'au moins {window} jours consécutifs ayant une température moyenne quotidienne au-dessus de {fourchette} et la première occurrence d'au moins {window} jours consécutifs ayant une température moyenne quotidienne sous {thresh}, survenant après {mid_date}", + "description": "Nombre {freq:m} de jours entre la première occurrence d'au moins {window} jours consécutifs ayant une température moyenne quotidienne au-dessus de {thresh} et la première occurrence d'au moins {window} jours consécutifs ayant une température moyenne quotidienne est sous {thresh}, survenant après {mid_date}.", "title": "Durée de la saison de croissance", - "abstract": "Nombre de jours entre la première série de N jours avec des températures journalières moyennes au-dessus d'un seuil et la première série de N jours avec des températures journalières moyennes sous ce même seuil." + "abstract": "Nombre de jours entre la première occurrence d'une série de jours ayant une température moyenne quotidienne au-dessus d'un seuil et la première occurrence d'une série de jours avec une température moyenne quotidienne sous ce même seuil, survenant après une date de calendrier donnée." }, "GROWING_SEASON_START": { - "long_name": "Jour de l'année du début de la saison de croissance", - "description": "Jour de l'année du début de la saison de croissance, défini comme le {window}e jour consécutif où la température excède {thresh}.", - "title": "Nième jour consécutif où la température excède un seuil", - "abstract": "Premier jour où la température excède un certain seuil depuis un certain nombre de jours consécutifs." + "long_name": "Premier jour de la première série de {window} jours ayant une température moyenne quotidienne égale ou au-dessus de {thresh}", + "description": "Jour de l’année marquant le début de la saison de croissance, défini comme le premier jour de la première série de {window} jours ayant une température moyenne quotidienne au-dessus ou égale à {thresh}", + "title": "Jour de l'année du début de la saison de croissance", + "abstract": "Premier jour où la température moyenne quotidienne est au-dessus d'un seuil donné depuis un certain nombre de jours consécutifs." }, "TROPICAL_NIGHTS": { - "long_name": "Nombre de nuits tropicales (Tmin > {thresh})", - "description": "Nombre {freq:m} de nuits tropicales : définies comme des jours avec une température minimale au-dessus de {thresh}.", + "long_name": "Nombre de jours où la température minimale quotidienne est au-dessus de {thresh}", + "description": "Nombre {freq:m} de nuits tropicales, définies comme des jours ayant une température minimale quotidienne au-dessus de {thresh}.", "title": "Nombre de nuits tropicales", - "abstract": "Nombre de jours où la température minimale est au-dessus d'un seuil." + "abstract": "Nombre de jours où la température minimale quotidienne est au-dessus d'un seuil donné." }, "BASE_FLOW_INDEX": { - "long_name": "Flux de base", + "long_name": "Écoulement de base", "description": "Minimum de la moyenne mobile sur 7 jours du flux moyen divisé par le flux moyen.", - "title": "Flux de base", + "title": "Écoulement de base", "abstract": "Minimum de la moyenne mobile sur 7 jours du flux moyen divisé par le flux moyen." }, "RB_FLASHINESS_INDEX": { "long_name": "Indice Richards-Baker de torrentialité", - "description": "Indice Richards-Baker mesurant le caractère torrentiel d'un débit de rivière.", + "description": "Indice R-B {freq:m}, un indice mesurant le caractère torrentiel d'un débit de rivière.", "title": "Indice Richards-Baker de torrentialité", "abstract": "Mesure des oscillations du débit relatif au débit moyen, quantifiant la fréquence et la rapidité des changements de débits." }, "FREQ_ANALYSIS": { - "long_name": "Période de retour {mode} {indexer} du flux de {window} jours", - "description": "Analyse de fréquence pour le {mode} {indexer} du flux de {window} jours, estimé avec la distribution {dist:f}.", + "long_name": "Période de retour du débit", + "description": "Analyse fréquentielle de type {dist:f} des débits moyens sur {window} jours, pour le {mode} {indexer}.", "title": "Période de retour", - "abstract": "Analyse de fréquence selon un mode et une distribution." + "abstract": "Analyse fréquentielle des débits selon un mode et une distribution." }, "STATS": { - "long_name": "{op} du {indexer} {freq:m} du flux journalier", - "description": "{op} du {indexer} {freq:m} du flux journalier.", + "long_name": "Statistique des débits quotidiens", + "description": "{op} {freq:f} des débits quotidiens ({indexer}).", "title": "Calcul de statistiques sur des sous-périodes.", "abstract": "" }, @@ -612,70 +617,70 @@ "abstract": "" }, "DOY_QMAX": { - "long_name": "Jour de l'année du maximum le long de {indexer}", - "description": "Jour de l'année du maximum le long de {indexer}.", - "title": "Jour de l'année du maximum", + "long_name": "Jour de l'année du maximum du débit en {indexer:nom}", + "description": "Jour de l'année du maximum du débit en {indexer:nom}.", + "title": "Jour de l'année du maximum du débit", "abstract": "" }, "DOY_QMIN": { - "long_name": "Jour de l'année du minimum le long de {indexer}", - "description": "Jour de l'année du minimum le long de {indexer}.", - "title": "Jour de l'année du minimum", + "long_name": "Jour de l'année du minimum du débit en {indexer:nom}", + "description": "Jour de l'année du minimum du débit en {indexer:nom}.", + "title": "Jour de l'année du minimum du débit", "abstract": "" }, "SEA_ICE_AREA": { - "long_name": "Surface de la banquise", + "long_name": "Somme des surfaces recouvertes de glace de mer là où sa concentration est d'au moins {thresh}", "description": "La somme des surfaces recouvertes de glace de mer là où sa concentration est d'au moins {thresh}.", "title": "Surface de la banquise", "abstract": "Mesure de surface totale des océans couverte de glace de mer." }, "SEA_ICE_EXTENT": { - "long_name": "Étendue de banquise", + "long_name": "Aire totale de toutes les régions où la concentration de glace de mer est d'au moins {thresh}", "description": "L'aire totale de toutes les régions où la concentration de glace de mer est d'au moins {thresh}.", "title": "Étendue de la banquise", - "abstract": "Mesure de l'étendue de toutes les régions où la concentration de glace de mer excède un seuil." + "abstract": "Mesure de l'étendue de toutes les régions où la concentration de glace de mer est au-dessus ou égale à un seuil donné." }, "DRY_DAYS": { - "long_name": "Nombre de jours secs (precip < {thresh})", - "description": "Nombre {freq} de jours où la précipitation journalière est sous {thresh}.", - "title": "Jours secs", - "abstract": "Nombre de jours où la précipitation journalière est sous un seuil." + "long_name": "Nombre de jours secs", + "description": "Nombre {freq:m} de jours où la précipitation quotidienne est sous {thresh}.", + "title": "Nombre de jours secs", + "abstract": "Nombre de jours où la précipitation quotidienne est sous un seuil donné." }, "HOT_SPELL_FREQUENCY": { - "long_name": "Nombre de périodes chaudes (Tmax > {thresh_tasmax} durant >= {window} jours)", - "description": "Nombre {freq} de périodes chaudes. Une période chaude se produit lorsque la température journalière maximale excède {thresh_tasmax} durant au moins {window} jours.", + "long_name": "Nombre total de séries d'au moins {window} jours consécutifs ayant une température maximale quotidienne au-dessus de {thresh_tasmax}", + "description": "Nombre {freq:m} de périodes chaudes durant une période donnée. Une période chaude se produit lorsque la température maximale quotidienne est au-dessus de {thresh_tasmax} durant au moins {window} jours.", "title": "Fréquences des périodes chaudes", - "abstract": "Nombre de périodes chaudes dans un période donnée. Une période chaude se produit lorsque la température journalière maximale excède un seuil spécifique durant un minimum de jours." + "abstract": "Nombre de périodes chaudes durant une période donnée. Une période chaude se produit lorsque la température maximale quotidienne est au-dessus d'un seuil spécifique durant un minimum de jours donné." }, "LAST_SPRING_FROST": { - "long_name": "Jour de l'année du dernier gel printanier", - "description": "Jour de l'année du dernier gel printanier, defini comme le dernier jour où la température journalière moyenne reste sous {thresh} durant au moins {window} jours avant une certaine date.", + "long_name": "Dernier jour de température minimale quotidienne en dessous d'un seuil de {thresh} pendant au moins {window} jours avant une date donnée ({before_date})", + "description": "Jour de l'année du dernier gel printanier, défini comme le dernier jour où la température minimale quotidienne reste sous {thresh} durant au moins {window} jours avant une certaine date ({before_date}).", "title": "Jour de l'année du dernier gel printanier", - "abstract": "Dernier jour où la température est inférieur à un seuil durant un certain nombre de jours, limité par une date finale." + "abstract": "Dernier jour où la température minimale quotidienne reste sous un seuil donné durant un certain nombre de jours, limité par une date de calendrier finale." }, "HOT_SPELL_MAX_LENGTH": { - "long_name": "Longueur maximale des périodes chaudes (Tmax > {thresh_tasmax} durant >= {window} jours)", - "description": "Longueur maximale {freq:f} des périodes chaudes. Une période chaude se produit lorsque la température journalière maximale excède {thresh_tasmax} durant au moins {window} jours.", + "long_name": "Série la plus longue d'au moins {window} jours consécutifs ayant une température maximale quotidienne au-dessus de {thresh_tasmax}.", + "description": "Longueur maximale {freq:f} des périodes chaudes durant une période donnée. Une période chaude se produit lorsque la température maximale quotidienne est au-dessus de {thresh_tasmax} durant au moins {window} jours.", "title": "Longueur maximale des périodes chaudes", - "abstract": "Longueur maximale des périodes chaudes dans une période donnée. Une période chaude se produit lorsque la température journalière maximale excède un seuil spécifique durant un minimum de jours." + "abstract": "Longueur maximale des périodes chaudes durant une période donnée. Une période chaude se produit lorsque la température maximale quotidienne est au-dessus d'un seuil spécifique durant un minimum de jours." }, "CONSECUTIVE_FROST_FREE_DAYS": { - "long_name": "Nombre maximal de jours consécutifs avec Tmin >= {thresh}", - "description": "Nombre maximal {freq} de jours consécutifs où la température journalière minimale excède ou est égale à {thresh}.", - "title": "Nombre maximal de jours consécutifs sans gel (Tmin >= 0℃)", - "abstract": "La nombre maximal de jours consécutifs sans gel: où la température journalière minimale est au-dessus ou égale à un seuil." + "long_name": "Nombre maximal de jours consécutifs ayant une température minimale au-dessus ou égale à {thresh}", + "description": "Nombre maximal {freq:m} de jours consécutifs où la température minimale quotidienne est au-dessus ou égale à {thresh}.", + "title": "Nombre maximal de jours consécutifs sans gel", + "abstract": "Nombre maximal de jours consécutifs sans gel où la température minimale quotidienne est au-dessus ou égale à 0°C." }, "GROWING_SEASON_END": { - "long_name": "Jour de l'année de la fin de la saison de croissance", - "description": "Jour de l'année de la fin de la saison de croissance. La saison de croissance est définie comme l'intervalle entre la première série de {window} jours où la température journalière est au-dessus de {thresh} et la première série (après le {mid_date}) de {window} jours où elle est sous {thresh}.", + "long_name": "Premier jour de la première série de {window} jours ayant une température journalière moyenne sous {thresh}, survenant après {mid_date}", + "description": "Jour de l'année de la fin de la saison de croissance, défini comme le premier jour après {mid_date} ayant une température moyenne quotidienne au-dessus ou égale à {thresh} après une série de {window} jours ayant une température moyenne quotidienne sous {thresh}.", "title": "Fin de la saison de croissance", - "abstract": "Jour de l'année de la fin de la saison de croissance. La saison de croissance est définie comme l'intervalle entre la première série de N jours où la température journalière est au-dessus d'un seuil et la première série (après une certaine date) de N jours où elle est sous ce même seuil." + "abstract": "Le premier jour où la température moyenne quotidienne est sous un seuil donné pendant un certain nombre de jours consécutifs après une date de calendrier donnée." }, "FROST_FREE_SEASON_END": { - "long_name": "Jour de l'année de la fin de la saison sans gel", - "description": "Jour de l'année de la fin de la saison sans gel. La saison sans gel est définie comme l'intervalle entre la première série de {window} jours où la température journalière est au-dessus de {thresh} et la première série (après le {mid_date}) de {window} jours où elle est sous {thresh}.", + "long_name": "Premier jour, après {mid_date}, suivant une période de {window} jours ayant une température minimale quotidienne sous {thresh}", + "description": "Jour de l'année de la fin de la saison sans gel. La saison sans gel est définie comme l'intervalle entre la première série de {window} jours où la température minimale quotidienne est au-dessus ou égale à {thresh} et la première série (après le {mid_date}) de {window} jours où elle est sous {thresh}.", "title": "Fin de la saison sans gel", - "abstract": "Jour de l'année de la fin de la saison sans gél. La saison sans gel est définie comme l'intervalle entre la première série de N jours où la température journalière est au-dessus d'un seuil et la première série (après une certaine date) de N jours où elle est sous ce même seuil." + "abstract": "Premier jour où la température minimale quotidienne est sous un seuil donné depuis un certain nombre de jours consécutifs." }, "FWI": { "description": "L'IFM est formé de six composantes qui tiennent compte des effets de la teneur en eau des combustibles et des conditions météorologiques sur le comportement du feu.", @@ -684,15 +689,15 @@ }, "FWI.dc": { "long_name": "Indice de sécheresse", - "description": "Évaluation numérique de la teneur moyenne en eau des épaisses couches organiques compactes. Calculée avec la méthode de mise en route '{start_up_mode}'." + "description": "Évaluation numérique de la teneur moyenne en eau des épaisses couches organiques compactes." }, "FWI.dmc": { "long_name": "Indice d'humidité de l'humus", - "description": "Évaluation numérique de la teneur moyenne en eau des couches organiques peu tassées de moyenne épaisseur. Calculée avec la méthode de mise en route '{start_up_mode}'." + "description": "Évaluation numérique de la teneur moyenne en eau des couches organiques peu tassées de moyenne épaisseur." }, "FWI.ffmc": { "long_name": "Indice du combustible léger (FFMC)", - "description": "Évaluation numérique de la teneur en eau de la litière et d'autres combustibles légers. Calculée avec la méthode de mise en route '{start_up_mode}'." + "description": "Évaluation numérique de la teneur en eau de la litière et d'autres combustibles légers." }, "FWI.isi": { "long_name": "Indice de propagation initiale", @@ -711,168 +716,168 @@ "abstract": "Calcul de la magnitude et la direction de la vitesse du vent à partir des deux composantes ouest-est et sud-nord." }, "WIND_SPEED_FROM_VECTOR.sfcWind": { - "long_name": "Vitesse du vent de surface", - "description": "Magnitude de la vitesse du vent calculée à partir des deux composantes uas et vas." + "long_name": "Vitesse du vent près de la surface", + "description": "Magnitude de la vitesse du vent près de la surface calculée à partir des deux variables composantes ('uas' et 'vas')." }, "WIND_SPEED_FROM_VECTOR.sfcWindfromdir": { - "long_name": "Direction de provenance du vent de surface", - "description": "Direction de provenance du vent calculée à partir des deux composantes uas et vas. Les vents du nord ont une direction de 360° et les vents de moins de {calm_wind_thresh} ont une direction de 0°." + "long_name": "Direction de provenance du vent près de la surface", + "description": "Direction de provenance du vent près de la surface calculée à partir des deux variables composantes ('uas' et 'vas'). Les vents du nord ont une direction de 360° et les vents de moins de {calm_wind_thresh} ont une direction de 0°." }, "WIND_VECTOR_FROM_SPEED": { - "title": "Vitesse cartésienne du vent à partir de la magnitude et direction de provenance.", - "abstract": "Calcul des deux composantes ouest-est et nord-sud du vent à partir de la magnitude et la direction de provenance de sa vitesse." + "title": "Vitesse cartésienne du vent à partir de la magnitude et de la direction.", + "abstract": "Calcul des deux composantes ouest-est et nord-sud du vent à partir de la magnitude et de la direction." }, "WIND_VECTOR_FROM_SPEED.uas": { - "long_name": "Vent d'ouest de surface", - "description": "Vitesse d'ouest du vent de surface calculé à partir de la norme de sa vitesse et de sa direction de provenance." + "long_name": "Vent d'ouest près de la surface", + "description": "Vitesse du vent d'ouest près de la surface calculé à partir de la vitesse et de la direction du vent." }, "WIND_VECTOR_FROM_SPEED.vas": { - "long_name": "Vent du sud de surface", - "description": "Vitesse du sud du vent de surface calculé à partir de la norme de sa vitesse et de sa direction de provenance." + "long_name": "Vent du sud près de la surface", + "description": "Vitesse du vent du sud près de la surface calculé à partir de la vitesse et de la direction du vent." }, "E_SAT": { - "long_name": "Pression de vapeur saturante", + "long_name": "Pression de vapeur saturante (méthode \"{method}\")", "description": "Pression de vapeur saturante calculée à partir de la température en suivant la méthode {method}.", "title": "Pression de vapeur saturante (e_sat)", "abstract": "Calcul de la pression de vapeur saturante à partir de la température, selon une méthode donnée. Si ice_thresh est donné, le calcul se fait en référence à la glace pour les températures sous ce seuil." }, "HURS_FROMDEWPOINT": { - "long_name": "Humidité relative", - "description": "Calculée à partir de la température et du point de rosée à l'aide de la pression de vapeur saturante, laquelle fut calculée en suivant la méthode {method}.", - "title": "Humidité relative à partir du point de rosée", - "abstract": "Calcul de l'humidité relative à partir de la température et du point de rosée à l'aire de la pression de vapeur saturante." + "long_name": "Humidité relative (méthode \"{method}\")", + "description": "Humidité relative calculée à partir de la température du point de rosée à l'aide de la pression de vapeur saturante, laquelle fut calculée en suivant la méthode {method}.", + "title": "Humidité relative calculée à partir de la température du point de rosée", + "abstract": "Humidité relative calculée à partir de la température du point de rosée à l'aide de la pression de vapeur saturante." }, "HURS": { - "long_name": "Humidité relative", - "description": "Calculée à partir de la température, de l'humidité spécifique et de la pression à l'aide de la pression de vapeur saturante, laquelle fut calculée en suivant la méthode {method}.", - "title": "Humidité relative à partir de l'humidité spécifique et de la pression", - "abstract": "Calcul de l'humidité relative à partir de la température, de l'humidité spécifique et de la pression à l'aide de la pression de vapeur saturante." + "long_name": "Humidité relative (méthode \"{method}\")", + "description": "Humidité relative calculée à partir de la température, de l'humidité spécifique et de la pression à l'aide de la pression de vapeur saturante, laquelle fut calculée en suivant la méthode {method}.", + "title": "Humidité relative calculée à partir de la température, de l'humidité spécifique et de la pression", + "abstract": "Humidité relative calculée à partir de la température, de l'humidité spécifique et de la pression à l'aide de la pression de vapeur saturante." }, "HUSS": { - "long_name": "Humidité spécifique", - "description": "Calculée à partir de la température, de l'humidité relative et de la pression à l'aide de la pression de vapeur saturante, laquelle fut calculée en suivant la méthode {method}.", - "title": "Humidité spécifique à partir de l'humidité relative et de la pression", - "abstract": "Calcul de l'humidité spécifique à partir de la température, de l'humidité relative et de la pression à l'aide de la pression de vapeur saturante." + "long_name": "Humidité spécifique (méthode \"{method}\")", + "description": "Humidité spécifique calculée à partir de la température, de l'humidité relative et de la pression à l'aide de la pression de vapeur saturante, laquelle fut calculée en suivant la méthode {method}.", + "title": "Humidité spécifique calculée à partir de la température, de l'humidité relative et de la pression", + "abstract": "Humidité spécifique calculée à partir de la température, de l'humidité relative et de la pression à l'aide de la pression de vapeur saturante." }, "HUSS_FROMDEWPOINT": { - "long_name": "Humidité spécifique", - "description": "Calculée à partir de la température du point de rosée et de la pression à l'aide de la pression de vapeur saturante, laquelle fut calculée en suivant la méthode {method}.", - "title": "Humidité spécifique à partir de la température du point de rosée et de la pression", - "abstract": "Calcul de l'humidité spécifique à partir de la température du point de rosée et de la pression à l'aide de la pression de vapeur saturante." + "long_name": "Humidité spécifique (méthode \"{method}\")", + "description": "Humidité spécifique calculée à partir de la température du point de rosée et de la pression à l'aide de la pression de vapeur saturante, laquelle fut calculée en suivant la méthode {method}.", + "title": "Humidité spécifique calculée à partir de la température du point de rosée et de la pression", + "abstract": "Humidité spécifique calculée à partir de la température du point de rosée et de la pression à l'aide de la pression de vapeur saturante." }, "FIRST_DAY_BELOW": { - "long_name": "Premier jour de l'année avec une température sous {thresh}", - "description": "Premier jour de l'année avec une température sous {thresh} pour au moins {window} jours.", - "title": "Premier jour de l'année de températures sous un seuil", - "abstract": "Calcule le premier jour d'une période où la température est plus basse qu'un certain seuil durant un nombre de jours donné, limité par une date minimale." + "long_name": "Premier jour de l'année avec une température quotidienne sous un seuil", + "description": "Premier jour de l'année après {after_date} ayant une température quotidienne sous {thresh} pour au moins {window} jours.", + "title": "Premier jour de l'année avec une température quotidienne sous un seuil", + "abstract": "Calcule le premier jour d'une période où la température moyenne quotidienne est sous un seuil donné pendant un nombre de jours, après une date de calendrier donnée." }, "FIRST_DAY_TG_BELOW": { - "long_name": "Premier jour de l'année avec une température moyenne quotidienne sous {thresh}", - "description": "Premier jour de l'année avec une température moyenne quotidienne sous {thresh} pour au moins {window} jours.", + "long_name": "Premier jour de l'année avec une température moyenne quotidienne sous {thresh} durant au moins {window} jours", + "description": "Premier jour de l'année avec une température moyenne quotidienne sous {thresh} durant au moins {window} jours.", "title": "Premier jour de l'année de températures moyennes quotidiennes sous un seuil", "abstract": "Calcule le premier jour d'une période où la température moyenne quotidienne est plus basse qu'un certain seuil durant un nombre de jours donné, limité par une date minimale." }, "FIRST_DAY_TN_BELOW": { - "long_name": "Premier jour de l'année avec une température minimale quotidienne sous {thresh}", - "description": "Premier jour de l'année avec une température minimale quotidienne sous {thresh} pour au moins {window} jours.", + "long_name": "Premier jour de l'année avec une température minimale quotidienne sous {thresh} durant au moins {window} jours", + "description": "Premier jour de l'année avec une température minimale quotidienne sous {thresh} durant au moins {window} jours.", "title": "Premier jour de l'année de températures minimales quotidiennes sous un seuil", "abstract": "Calcule le premier jour d'une période où la température minimale quotidienne est plus basse qu'un certain seuil durant un nombre de jours donné, limité par une date minimale." }, "FIRST_DAY_TX_BELOW": { - "long_name": "Premier jour de l'année avec une température maximale quotidienne sous {thresh}", - "description": "Premier jour de l'année avec une température maximale quotidienne sous {thresh} pour au moins {window} jours.", + "long_name": "Premier jour de l'année avec une température maximale quotidienne sous {thresh} durant au moins {window} jours", + "description": "Premier jour de l'année avec une température maximale quotidienne sous {thresh} durant au moins {window} jours.", "title": "Premier jour de l'année de températures maximales quotidiennes sous un seuil", "abstract": "Calcule le premier jour d'une période où la température maximale quotidienne est plus basse qu'un certain seuil durant un nombre de jours donné, limité par une date minimale." }, "FIRST_DAY_ABOVE": { - "long_name": "Premier jour de l'année avec une température au-dessus de {thresh}", - "description": "Premier jour de l'année avec une température au-dessus de {thresh} pour au moins {window} jours.", - "title": "Premier jour de l'année de températures au-dessus d'un seuil", - "abstract": "Calcule le premier jour d'une période où la température est plus élevée qu'un certain seuil durant un nombre de jours donné, limité par une date minimale." + "long_name": "Premier jour de l'année avec une température quotidienne au-dessus d'un seuil", + "description": "Premier jour de l'année avec une température quotidienne au-dessus de {thresh} pour au moins {window} jours après {after_date}.", + "title": "Premier jour de l'année avec un température quotidienne au-dessus d'un seuil", + "abstract": "Calcule le premier jour d'une période où la température quotidienne est au-dessus d'un seuil donné pendant un nombre de jours, après une date de calendrier donnée." }, "FIRST_DAY_TG_ABOVE": { - "long_name": "Premier jour de l'année avec une température moyenne quotidienne au-dessus de {thresh}", - "description": "Premier jour de l'année avec une température moyenne quotidienne au-dessus de {thresh} pour au moins {window} jours.", + "long_name": "Premier jour de l'année avec une température moyenne quotidienne au-dessus de {thresh} durant au moins {window} jours", + "description": "Premier jour de l'année avec une température moyenne quotidienne au-dessus de {thresh} durant au moins {window} jours.", "title": "Premier jour de l'année de températures moyennes quotidiennes au-dessus d'un seuil", "abstract": "Calcule le premier jour d'une période où la température moyenne quotidienne est plus élevée qu'un certain seuil durant un nombre de jours donné, limité par une date minimale." }, "FIRST_DAY_TN_ABOVE": { - "long_name": "Premier jour de l'année avec une température minimale quotidienne au-dessus de {thresh}", - "description": "Premier jour de l'année avec une température minimale quotidienne au-dessus de {thresh} pour au moins {window} jours.", + "long_name": "Premier jour de l'année avec une température minimale quotidienne au-dessus de {thresh} durant au moins {window} jours", + "description": "Premier jour de l'année avec une température minimale quotidienne au-dessus de {thresh} durant au moins {window} jours.", "title": "Premier jour de l'année de températures minimales quotidiennes au-dessus d'un seuil", "abstract": "Calcule le premier jour d'une période où la température minimale quotidienne est plus élevée qu'un certain seuil durant un nombre de jours donné, limité par une date minimale." }, "FIRST_DAY_TX_ABOVE": { - "long_name": "Premier jour de l'année avec une température maximale quotidienne au-dessus de {thresh}", - "description": "Premier jour de l'année avec une température maximale quotidienne au-dessus de {thresh} pour au moins {window} jours.", + "long_name": "Premier jour de l'année avec une température maximale quotidienne au-dessus de {thresh} durant au moins {window} jours", + "description": "Premier jour de l'année avec une température maximale quotidienne au-dessus de {thresh} durant au moins {window} jours.", "title": "Premier jour de l'année de températures maximales quotidiennes au-dessus d'un seuil", "abstract": "Calcule le premier jour d'une période où la température maximale quotidienne est plus élevée qu'un certain seuil durant un nombre de jours donné, limité par une date minimale." }, "DEGREE_DAYS_EXCEEDANCE_DATE": { - "long_name": "Premier jour de l'année où la somme des degrés-jours excède {sum_thresh}", - "description": "Premier jour de l'année où la somme des degrés-jours (Tmoy {op} {thresh}) excède {sum_thresh}, la somme commençant le {start_date}.", + "long_name": "Premier jour de l'année où l'intégral de la température moyenne quotidienne {op} {thresh} est au-dessus de {sum_thresh}, avec la somme cumulative à partir de {after_date}", + "description": "Premier jour de l'année où l'intégral des degrés-jours (ou température moyenne quotidienne {op} {thresh}) est au-dessus de {sum_thresh}, avec la somme cumulative à partir de {after_date}.", "title": "Jour du dépassement des degrés-jours", - "abstract": "Jour de l'année où la somme des degrés-jours excède un seuil. Les degrés-jours sont calculés au-dessus ou au-dessous d'un seuil de température donné." + "abstract": "Jour de l'année où la somme des degrés-jours est au-dessus d'un seuil donné, survenant après une date donnée. Les degrés-jours sont calculés au-dessus ou en dessous d'un seuil de température donné." }, "PRSN": { - "long_name": "Précipitation solide", + "long_name": "Précipitation solide (méthode \"{methode}\" avec une température égale ou inférieure à {thresh})", "description": "Précipitation solide estimée à partir de la précipitation totale et de la température selon la méthode {method} et le seuil de température {thresh}.", "title": "Approximation de la neige", "abstract": "Précipitation solide estimée à partir de la précipitation totale et de la température selon une méthode et un seuil de température donnés." }, - "SD": { - "long_name": "Profondeur de neige journalière moyenne", - "description": "Profondeur de neige journalière moyenne.", + "SNOW_DEPTH": { + "long_name": "Épaisseur de neige moyenne quotidienne", + "description": "Épaisseur de neige moyenne quotidienne.", "title": "Moyenne de la profondeur de neige", - "abstract": "Profondeur de neige journalière moyenne." + "abstract": "Épaisseur de neige moyenne quotidienne." }, "PRLP": { - "long_name": "Précipitation liquide", + "long_name": "Précipitation liquide (méthode \"{methode}\" avec une température égale ou inférieure à {thresh})", "description": "Précipitation liquide estimée à partir de la précipitation totale et de la température selon la méthode {method} et le seuil de température {thresh}.", "title": "Approximation de la pluie", "abstract": "Précipitation liquide estimée à partir de la précipitation totale et de la température selon une méthode et un seuil de température donnés." }, "LAST_SNOWFALL": { - "long_name": "Date de la dernière neige", - "description": "Dernier jour {freq:m} où la précipitation solide excède {thresh}.", - "title": "Dernier jour avec une précipitation solide au-dessus d'un seuil", - "abstract": "Dernier jour d'une période où la précipitation solide excède un certain seuil." + "long_name": "Date du dernier jour où la précipitation solide est au-dessus de {thresh}", + "description": "Dernier jour {freq:m} où la précipitation solide est au-dessus de {thresh}.", + "title": "Dernier jour avec une précipitation solide au-dessus d'un seuil donné", + "abstract": "Dernier jour d'une période où la précipitation solide est au-dessus d'un seuil donné." }, "FIRST_SNOWFALL": { - "long_name": "Date de la première neige", - "description": "Premier jour {freq:m} où la précipitation solide excède {thresh}.", - "title": "Premier jour avec une précipitation solide au-dessus d'un seuil", - "abstract": "Premier jour d'une période où la précipitation solide excède un certain seuil." + "long_name": "Date du premier jour où la précipitation solide est au-dessus de {thresh}", + "description": "Premier jour {freq:m} où la précipitation solide est au-dessus de {thresh}.", + "title": "Premier jour avec une précipitation solide au-dessus d'un seuil donné", + "abstract": "Premier jour d'une période où la précipitation solide est au-dessus d'un seuil donné." }, "DAYS_WITH_SNOW": { - "long_name": "Nombre de jours où la précipitation solide se trouve entre une borne inférieure et supérieure.", + "long_name": "Nombre de jours où la précipitation solide se trouve entre une borne de {low} et {high}", "description": "Nombre {freq:m} de jours où la précipitation solide est plus grande que {low} et plus petite ou égale à {high}.", "title": "Jours avec neige", "abstract": "Nombre de jours où la neige est entre une borne inférieure et supérieure." }, "SNOW_COVER_DURATION": { - "long_name": "Nombre de jour où la profondeur de neige est au-dessus d'un seuil", - "description": "Nombre {freq:m} de jours où la profondeur de neige est supérieure ou égale à {thresh}.", + "long_name": "Nombre de jour où l'épaisseur de neige est au-dessus d'un seuil", + "description": "Nombre {freq:m} de jours où l'épaisseur de neige est au-dessus ou égale à {thresh}.", "title": "Durée du couvert de neige", - "abstract": "Nombre de jours pendant lesquels la profondeur de neige est supérieure ou égale à un seuil." + "abstract": "Nombre de jours pendant lesquels l'épaisseur de neige est au-dessus ou égale à un seuil donné." }, "CONTINUOUS_SNOW_COVER_START": { - "long_name": "Date d'établissement du couvert de neige", - "description": "Première date à laquelle la profondeur de neige est supérieure à {thresh} pendant au moins {window} jours.", + "long_name": "Date du début du couvert de neige continu", + "description": "Première date à laquelle l'épaisseur de neige est au-dessus ou égale à {thresh} pendant au moins {window} jours consécutifs.", "title": "Date du début du couvert de neige", - "abstract": "Première date à partir de laquelle la profondeur de neige est supérieure ou égale à un seuil pendant un nombre de jours consécutifs." + "abstract": "Première date à partir de laquelle l'épaisseur de neige est au-dessus ou égale à un seuil donné pendant un nombre de jours consécutifs." }, "CONTINUOUS_SNOW_COVER_END": { - "long_name": "Date de disparition du couvert de neige", - "description": "Première date à laquelle la profondeur de neige passe sous {thresh} pendant au moins {window} jours suite à l'établissement du couvert de neige.", + "long_name": "Date de fin du couvert de neige continu", + "description": "Première date à laquelle l'épaisseur de neige passe sous {thresh} pendant au moins {window} jours consécutifs suite à l'établissement du couvert de neige.", "title": "Date du fin du couvert de neige", - "abstract": "Première date à partir de laquelle la profondeur de neige est inférieure à un seuil pendant un nombre de jours consécutifs suite à l'établissement du couvert de neige." + "abstract": "Première date à partir de laquelle l'épaisseur de neige est sous à un seuil donné pendant un nombre de jours consécutifs suite au début du couvert de neige." }, "SND_MAX_DOY": { - "long_name": "Date de la profondeur de neige maximale", - "description": "Date {freq:f} à laquelle la profondeur de neige atteint sa valeur maximale.", - "title": "Date où la profondeur de neige est maximale", - "abstract": "Jour de l'année où la profondeur de neige atteint sa valeur maximale." + "long_name": "Date de l'épaisseur de neige maximale", + "description": "Date {freq:f} à laquelle l'épaisseur de neige atteint sa valeur maximale.", + "title": "Date où l'épaisseur de neige est maximale", + "abstract": "Jour de l'année où l'épaisseur de neige atteint sa valeur maximale." }, "SNOW_MELT_WE_MAX": { "long_name": "Fonte de neige maximale", @@ -881,16 +886,16 @@ "abstract": "Équivalent en eau de la fonte de neige maximale." }, "SNW_MAX": { - "long_name": "Quantité de neige maximale", - "description": "Quantité maximale {freq:f} de neige.", - "title": "Quantité de neige maximale", - "abstract": "Maximum de la quantité de neige journalière." + "long_name": "Équivalent en eau de la neige maximale", + "description": "Équivalent en eau maximale {freq:f} de la neige.", + "title": "Équivalent en eau de la neige maximale", + "abstract": "Maximum de la quantité de neige quotidienne." }, "SNW_MAX_DOY": { "long_name": "Date de la quantité de neige maximale", "description": "Date {freq:f} à laquelle la quantité de neige atteint sa valeur maximale.", "title": "Date où la quantité de neige est maximale", - "abstract": "Jour de l'année où la quantité de neige atteint sa valeur maximale." + "abstract": "Jour de l'année où l'équivalent en eau de la neige quotidienne atteint sa valeur maximale." }, "MELT_AND_PRECIP_MAX": { "long_name": "Maximum des apports en eau incluant la fonte de neige et les précipitations", @@ -900,200 +905,200 @@ }, "BLOWING_SNOW": { "long_name": "Jours de poudrerie", - "description": "Nombre {freq:m} de jours avec accumulation de neige supérieure ou égale à {snd_thresh} au cours des {window} jours précédents et vents supérieurs à {sfcwind_thresh}.", + "description": "Nombre {freq:m} de jours avec accumulation de neige au-dessus ou égale à {snd_thresh} au cours des {window} jours précédents et vents supérieurs à {sfcwind_thresh}.", "title": "Nombre de jours de poudrerie", - "abstract": "Nombre de jours où les conditions sont favorables à la poudrerie." + "abstract": "Nombre de jours avec des chutes de neige, une épaisseur de neige et une vitesse du vent au-dessus ou égales à des seuils donnés pendant une période de jours." }, "WINTER_STORM": { "long_name": "Jours avec forte accumulation de neige", - "description": "Nombre de jours où l'accumulation de neige est supérieure à {thresh}.", + "description": "Nombre de jours où l'accumulation de neige est au-dessus ou égale à {thresh}.", "title": "Jours avec accumulation de neige supérieure à un seuil", - "abstract": "Nombre de jours où l'accumulation de neige est supérieure à un seuil." + "abstract": "Nombre de jours où l'accumulation de neige est au-dessus ou égale à un seuil donné." }, "HIGH_PRECIP_LOW_TEMP": { - "long_name": "Jours avec des précipitations au dessus d'un seuil et des températures sous un seuil", + "long_name": "Jours avec des précipitations au dessus de {pr_thresh} et des températures sous {tas_thresh}", "description": "Nombre {freq:m} de jours avec précipitation plus grande ou égale à {pr_thresh} et température inférieure à {tas_thresh}.", "title": "Jours avec précipitations et températures froides", - "abstract": "Nombre de jours avec précipitation au-dessus d'un seuil et températures sous un seuil." + "abstract": "Nombre de jours avec précipitation au-dessus d'un seuil et températures sous un seuil donné." }, "DAYS_OVER_PRECIP_THRESH": { - "title": "Nombre de jours pluvieux où la précipitation est au-dessus du {pr_per_thresh}e percentile", - "abstract": "Nombre de jours d'une période où la précipitation est au-dessus du {pr_per_thresh}e percentile calculé sur la période {pr_per_period} et d'un seuil fixe.", - "description": "Nombre {freq:m} de jours où la précipitation est au-dessus du {pr_per_thresh}e percentile calculé sur la période {pr_per_period}. Seuls les jours avec au moins {thresh} sont comptés.", - "long_name": "Nombre de jours pluvieux où la précipitation est au-dessus du {pr_per_thresh}e percentile calculé sur la période {pr_per_period}" + "long_name": "Nombre de jours avec précipitation où la précipitation est au-dessus du {pr_per_thresh}e centile calculé sur la période {pr_per_period}.", + "title": "Nombre de jours avec précipitation où la précipitation est au-dessus d'un centile donné", + "abstract": "Nombre de jours d'une période où la précipitation est au-dessus d'un centile donné, calculé sur une période donnée et un seuil fixe.", + "description": "Nombre {freq:m} de jours où la précipitation est au-dessus du {pr_per_thresh}e centile calculé sur la période {pr_per_period}. Seuls les jours avec au moins {thresh} sont comptés." }, "DAYS_OVER_PRECIP_DOY_THRESH": { - "title": "Nombre de jours pluvieux où la précipitation est au-dessus du {pr_per_thresh}e percentile quotidien", - "abstract": "Nombre de jours d'une période où la précipitation est au-dessus du {pr_per_thresh}e percentile quotidien et d'un seuil fixe.", - "description": "Nombre {freq:m} de jours où la précipitation est au-dessus du {pr_per_thresh}e percentile quotidien. Seuls les jours avec au moins {thresh} sont comptés. Le {pr_per_thresh}e percentile est calculé sur une fenêtre glissante de {pr_per_window} jour(s) de la période {pr_per_period}.", - "long_name": "Nombre de jours pluvieux où la précipitation est au-dessus du {pr_per_thresh}e percentile quotidien" + "long_name": "Nombre de jours avec précipitation quotidien où la précipitation est au-dessus du {pr_per_thresh}e centile calculé sur la période {pr_per_period}", + "title": "Nombre de jours avec précipitation où la précipitation est au-dessus d'un centile quotidien donné", + "abstract": "Nombre de jours d'une période où la précipitation est au-dessus d'un centile quotidien donné et d'un seuil fixe.", + "description": "Nombre {freq:m} de jours où la précipitation est au-dessus du {pr_per_thresh}e centile quotidien. Seuls les jours avec au moins {thresh} sont comptés. Le {pr_per_thresh}e centile est calculé sur une fenêtre glissante de {pr_per_window} jour(s) de la période {pr_per_period}." }, "FRACTION_OVER_PRECIP_THRESH": { - "title": "Fraction des jours pluvieux où la précipitation est au-dessus d'un percentile quotidien.", - "abstract": "Fraction des jours pluvieux d'une période où la précipitation est au-dessus d'un percentile quotidien. La référence est le nombre de jours où la précipitation est au-dessus d'un seuil fixe.", - "description": "Fraction {freq:f} des jours pluvieux où la précipitation est au-dessus d'un percentile quotidien. La référence est le nombre jours où la précipitation est au-dessus d'un seuil fixe.", - "long_name": "Fraction des jours pluvieux où la précipitation est au-dessus d'un percentile quotidien." + "long_name": "Fraction des jours avec précipitation où la précipitation est au-dessus du {pr_per_thresh}e centile quotidien", + "title": "Fraction des jours avec précipitation où la précipitation est au-dessus d'un centile quotidien.", + "abstract": "Fraction des jours avec précipitation d'une période où la précipitation est au-dessus d'un centile quotidien. La référence est le nombre de jours où la précipitation est au-dessus d'un seuil fixe.", + "description": "Fraction {freq:f} des jours avec précipitation où la précipitation est au-dessus du {pr_per_thresh}e centile quotidien. La référence est le nombre jours où la précipitation est au-dessus d'un seuil fixe." }, "FRACTION_OVER_PRECIP_DOY_THRESH": { - "title": "Fraction de jours pluvieux où la précipitation est au-dessus du {pr_per_thresh}e percentile quotidien", - "abstract": "Fraction de jours d'une période où la précipitation est au-dessus du {pr_per_thresh}e percentile quotidien et d'un seuil fixe.", - "description": "Fraction {freq:m} de jours où la précipitation est au-dessus du {pr_per_thresh}e percentile quotidien. Seuls les jours avec au moins {thresh} sont comptés. Le {pr_per_thresh}e percentile est calculé sur une fenêtre glissante de {pr_per_window} jour(s) de la période {pr_per_period}.", - "long_name": "Fraction de jours pluvieux où la précipitation est au-dessus du {pr_per_thresh}e percentile quotidien" + "long_name": "Fraction de jours avec précipitation où la précipitation est au-dessus du {pr_per_thresh}e centile quotidien", + "title": "Fraction de jours avec précipitation où la précipitation est au-dessus d'un centile quotidien", + "abstract": "Fraction de jours d'une période où la précipitation quotidien est au-dessus du {pr_per_thresh}e centile quotidien et d'un seuil fixe.", + "description": "Fraction {freq:m} de jours où la précipitation est au-dessus du {pr_per_thresh}e centile quotidien. Seuls les jours avec au moins {thresh} sont comptés. Le {pr_per_thresh}e centile est calculé sur une fenêtre glissante de {pr_per_window} jour(s) de la période {pr_per_period}." }, "LIQUID_PRECIP_RATIO": { + "long_name": "Fraction liquide de la précipitation totale (température au-dessus de {thresh})", "title": "Fraction liquide de la précipitation totale", - "abstract": "Le ratio entre la précipitation liquide et la précipitation totale. La précipitation liquide est approximée par la précipitation lorsque la température est au-dessus d'un seuil.", - "description": "Le ratio {freq:m} entre la précipitation liquide et la précipitation totale. La précipitation liquide est approximée par la précipitation lorsque la température est au-dessus de {thresh}.", - "long_name": "Fraction liquide de la précipitation totale" + "abstract": "Le ratio entre la précipitation liquide et la précipitation totale. La précipitation liquide est approximée par la précipitation lorsque la température est au-dessus d'un seuil donné.", + "description": "Le ratio {freq:m} entre la précipitation liquide et la précipitation totale. La précipitation liquide est approximée par la précipitation lorsque la température est au-dessus de {thresh}." }, "WARM_SPELL_DURATION_INDEX": { + "long_name": "Nombre de jours avec au moins {window} jours consécutifs ayant une température maximale quotidienne au-dessus du ou des {tasmax_per_thresh}ème(s) percentile(s)", "title": "Indice de durée des vagues de chaleur", - "abstract": "Nombre de jours faisant partie de vagues d'une longueur minimale où la température maximale quotidienne excède le {per_base_thresh}e percentile. Le {per_base_thresh} percentile des températures devrait être calculé avec une fenêtre mobile de {per_window} jours.", - "description": "Durée totale {freq:f} des vagues de chaleur. Une vague de chaleur se produit lorsque Tmax est au-dessus du {per_base_thresh}e percentile durant au moins {window} jours.", - "long_name": "Durée des vagues de chaleur" + "abstract": "Nombre de jours consécutifs plus grand qu'un nombre de jours minimal donnée et ayant une température maximale quotidienne plus grande qu'un centile donné. Le seuil de centile des températures doit être calculé avec une fenêtre mobile d'un nombre de jours donné.", + "description": "Nombre de jours avec au moins {window} jours consécutifs où la température maximale quotidienne est au-dessus ou égale au(x) {tasmax_per_thresh}e centile(s). Une fenêtre de {tasmax_per_window} jour(s), centrée sur chaque jour du calendrier de la période {tasmax_per_period}, est utilisée pour calculer le(s) {tasmax_per_thresh}e(s) centile(s)." }, "MAXIMUM_CONSECUTIVE_WARM_DAYS": { + "long_name": "Nombre maximal de jours consécutifs ayant une température maximale quotidienne au-dessus de {thresh}", + "description": "La plus longue période {freq:m} de jours consécutifs ayant une température maximale quotidienne au-dessus de {thresh}.", "title": "Nombre maximal de jours chauds consécutifs", - "abstract": "Nombre maximal de jours consecutifs où la température maximale quotidienne excède un certain seuil.", - "description": "Nombre {freq:m} maximal de jours chauds consécutifs (Tmax > {thresh}).", - "long_name": "Nombre maximal de jours chauds consécutifs" + "abstract": "Nombre maximal de jours consécutifs ayant une température maximale quotidienne au-dessus d'un seuil donné." }, "FIRE_SEASON": { - "title": "Saison des incendies", - "abstract": "Masque binaire de la saison des incendies, défini selon des conditions de températures quotidiennes consécutives et, optionnellement, d'épaisseurs du couvert de neige.", + "long_name": "Saison des incendies", "description": "Masque de la saison des incendies, calculé selon la méthode {method}", - "long_name": "Saison des incendies" + "title": "Saison des incendies", + "abstract": "Masque binaire de la saison des incendies, défini selon des conditions de températures quotidiennes consécutives et, optionnellement, d'épaisseurs du couvert de neige." }, "CORN_HEAT_UNITS": { "title": "Unités thermiques maïs", - "abstract": "Indice basé sur la température utilisé pour estimer le développement des cultures de maïs. La croissance du maïs se produit lorsque la température journalière minimale et maximale excèdent des seuils donnés.", - "description": "Indice basé sur la température utilisé pour estimer le développement des cultures de maïs. La croissance du maïs se produit lorsque la température journalière minimale et maximale excèdent {thresh_tasmin} et {thresh_tasmax}, respectivement.)", - "long_name": "Unités thermiques maïs (Tmin > {thresh_tasmin} et Tmax > {thresh_tasmax})." + "abstract": "Indice basé sur la température utilisée pour estimer le développement des cultures de maïs. La croissance du maïs se produit lorsque la température minimale quotidienne et la température maximale quotidienne excèdent des seuils donnés.", + "description": "Indice basé sur la température utilisée pour estimer le développement des cultures de maïs. La croissance du maïs se produit lorsque la température minimale quotidienne et et la température maximale quotidienne excèdent {thresh_tasmin} et {thresh_tasmax}, respectivement.", + "long_name": "Unités thermiques maïs (Tmin > {thresh_tasmin} et Tmax > {thresh_tasmax})" }, "FREEZETHAW_SPELL_FREQUENCY": { - "title": "Fréquence des événements de gel-dégel quotidien", - "abstract": "Nombre de périodes de gel-dégel. Ces périodes sont des séries de jours consécutifs où la température minimale quotidienne est sous un seuil et la température maximale quotidienne au-dessus d'un autre. En général, ces deux seuils sont 0°C.", - "description": "Fréquence {freq:f} des événements de gel-dégel quotidiens : Tmax > {thresh_tasmax} et Tmin <= {thresh_tasmin} pour au moins {window} jour(s) consecutif(s).", - "long_name": "Fréquence {freq:f} des événements de gel-dégel quotidien" + "long_name": "Fréquence des périodes où les températures maximales quotidiennes sont au-dessus de {thresh_tasmax} et les températures minimales quotidiennes sont égales ou en dessous de {thresh_tasmin} pendant au moins {window} jour(s) consécutif(s)", + "description": "Fréquence {freq:f} périodes des événements consécutifs de gel-dégel (températures maximales au-dessus de {thresh_tasmax} et températures minimales en dessous ou égales à {thresh_tasmin} pour au moins {window} jour(s) consécutif(s)).", + "title": "Fréquence des périodes des événements consécutifs de gel-dégel", + "abstract": "Fréquence des périodes des événements consécutifs de gel-dégel. Une période de gel-dégel est définie comme un nombre de jours consécutifs où les températures maximales quotidiennes sont au-dessus d'un seuil donné et les températures minimales quotidiennes sont en dessous ou égales à un seuil donné, généralement 0°C pour les deux." }, "FREEZETHAW_SPELL_MAX_LENGTH": { - "title": "Durée maximale d'une période de jours consécutifs avec un gel-dégel", - "abstract": "Durée maximale des périodes de gel-dégel. Ces périodes sont des séries de jours consécutifs où la température minimale quotidienne est sous un seuil et la température maximale quotidienne au-dessus d'un autre. En général, ces deux seuils sont 0°C.", - "description": "Durée maximale {freq:f} des événements de gel-dégel quotidien : Tmax > {thresh_tasmax} et Tmin <= {thresh_tasmin} pour au moins {window} jour(s) consecutif(s).", - "long_name": "Durée maximale {freq:f} des événements de gel-dégel quotidien" + "long_name": "Durée maximale des périodes où les températures maximales quotidiennes sont au-dessus de {thresh_tasmax} et les températures minimales quotidiennes sont égales ou en dessous de {thresh_tasmin} pendant au moins {window} jour(s) consécutif(s)", + "description": "Durée maximale {freq:f} des périodes des événements consécutifs de gel-dégel (températures maximales au-dessus de {thresh_tasmax} et températures minimales en dessous ou égales à {thresh_tasmin} pour au moins {window} jour(s) consécutif(s)).", + "title": "Durée maximale des périodes des événements consécutifs de gel-dégel", + "abstract": "Durée maximale des périodes des événements consécutifs de gel-dégel. Une période de gel-dégel est définie comme un nombre de jours consécutifs où les températures maximales quotidiennes sont au-dessus d'un seuil donné et les températures minimales quotidiennes sont en dessous ou égales à un seuil donné, généralement 0°C pour les deux." }, "FREEZETHAW_SPELL_MEAN_LENGTH": { - "title": "Durée moyenne d'une période de jours consécutifs avec un gel-dégel", - "abstract": "Durée moyenne des périodes de gel-dégel. Ces périodes sont des séries de jours consécutifs où la température minimale quotidienne est sous un seuil et la température maximale quotidienne au-dessus d'un autre. En général, ces deux seuils sont 0°C.", - "description": "Durée moyenne {freq:f} des événements de gel-dégel quotidien : Tmax > {thresh_tasmax} et Tmin <= {thresh_tasmin} pour au moins {window} jour(s) consecutif(s).", - "long_name": "Durée moyenne {freq:f} des événements de gel-dégel quotidien" + "long_name": "Durée moyenne des périodes où les températures maximales quotidiennes sont au-dessus de {thresh_tasmax} et les températures minimales quotidiennes sont égales ou en dessous de {thresh_tasmin} pendant au moins {window} jour(s) consécutif(s)", + "description": "Durée moyenne {freq:f} des spériodes des événements consécutifs de gel-dégel (températures maximales au-dessus de {thresh_tasmax} et températures minimales en dessous ou égales à {thresh_tasmin} pour au moins {window} jour(s) consécutif(s)).", + "title": "Durée moyenne des périodes des événements consécutifs de gel-dégel", + "abstract": "Durée moyenne des périodes des événements consécutifs de gel-dégel. Une période de gel-dégel est définie comme un nombre de jours consécutifs où les températures maximales quotidiennes sont au-dessus d'un seuil donné et les températures minimales quotidiennes sont en dessous ou égales à un seuil donné, généralement 0°C pour les deux." }, "WIND_CHILL": { + "long_name": "Indice de facteur éolien", + "description": "L'indice de refroiddissement éolien, équivalent à la température ressentie due au vent par un individu moyen.", "title": "Facteur éolien", - "abstract": "Le facteur éolien est un indice qui équivaut à la sensation du froid par un individu moyen. Il est calculé à partir de la température et de la vitesse du vent à 10 m. Tel que définit par Environnement et Changement Climatique Canada, une seconde formule est utilisé pour les vents faibles. La formule standard est sinon la même qu'utilisée aux États-Unis.", - "description": "Refroiddissement éolien, équivalent à la sensation du froid due au vent par in individu moyen.", - "long_name": "Facteur éolien" + "abstract": "Le facteur éolien est un indice qui équivaut à la sensation du froid par un individu moyen. Il est calculé à partir de la température et de la vitesse du vent à 10 m. Tel que définit par Environnement et Changement Climatique Canada, une seconde formule est utilisée pour les vents faibles. La formule standard est sinon la même qu'utilisée aux États-Unis." }, "HUMIDEX": { - "title": "Indice humidex", - "abstract": "L'indice humidex décrit la température ressentie par une personne lorsqu'on tient compte de l'humidité relative. Il peut être interpreté comme la température équivalente ressentie lorsque l'air est sec.", + "long_name": "indice humidex", "description": "Indice humidex décrivant la température ressentie par une personne en réponse à l'humidité relative.", - "long_name": "indice humidex" + "title": "Indice humidex", + "abstract": "L'indice humidex décrit la température ressentie par une personne lorsqu'on tient compte de l'humidité relative. Il peut être interpreté comme la température équivalente ressentie lorsque l'air est sec." }, "HEAT_INDEX": { - "title": "Indice de chaleur", - "abstract": "L'indice de chaleur est une estimation de la température ressentie par une personne à l'ombre lorsqu'on tient compte de l'humidité relative.", + "long_name": "Indice de chaleur", "description": "Température ressentie estimée avec l'humidité relative et la température ambiante.", - "long_name": "Indice de chaleur" + "title": "Indice de chaleur", + "abstract": "L'indice de chaleur est une estimation de la température ressentie par une personne à l'ombre lorsqu'on tient compte de l'humidité relative." }, "POTENTIAL_EVAPOTRANSPIRATION": { - "title": "Évapotranspiration potentielle", - "abstract": "Le potentiel d'évaporation de l'eau du sol et de transpiration par les plantes si l'approvisionnement en eau est suffisant, avec une méthode donnée.", + "long_name": "Évapotranspiration potentielle (méthode \"{methode}\")", "description": "Le potentiel d'évaporation de l'eau du sol et de transpiration par les plantes si l'approvisionnement en eau est suffisant, avec la méthode de {method}.", - "long_name": "Évapotranspiration potentielle" + "title": "Évapotranspiration potentielle", + "abstract": "Le potentiel d'évaporation de l'eau du sol et de transpiration par les plantes si l'approvisionnement en eau est suffisant, avec une méthode donnée." }, "WATER_BUDGET_FROM_TAS": { - "title": "Bilan hydrique", - "abstract": "Précipitations moins l'évapotranspiration potentielle en tant que mesure approximative d'un bilan hydrique de surface, où l'évapotranspiration potentielle est calculée avec une méthode donnée.", + "long_name": "Bilan hydrique (méthode \"{methode}\")", "description": "Précipitations moins l'évapotranspiration potentielle en tant que mesure approximative d'un bilan hydrique de surface, où l'évapotranspiration potentielle est calculée avec la méthode {method}.", - "long_name": "Bilan hydrique" + "title": "Bilan hydrique", + "abstract": "Précipitations moins l'évapotranspiration potentielle en tant que mesure approximative d'un bilan hydrique de surface, où l'évapotranspiration potentielle est calculée avec une méthode donnée." }, "WATER_BUDGET": { - "title": "Bilan hydrique", - "abstract": "Précipitations moins l'évapotranspiration potentielle en tant que mesure approximative d'un bilan hydrique de surface.", + "long_name": "Bilan hydrique", "description": "Précipitations moins l'évapotranspiration potentielle en tant que mesure approximative d'un bilan hydrique de surface.", - "long_name": "Bilan hydrique" + "title": "Bilan hydrique", + "abstract": "Précipitations moins l'évapotranspiration potentielle en tant que mesure approximative d'un bilan hydrique de surface." }, "DRY_SPELL_FREQUENCY": { - "title": "Fréquence des périodes sèches", - "abstract": "Fréquence des périodes sèches de n jours et plus, pendant lesquelles les précipitations accumulées ou maximales sur une fenêtre de n jours sont inférieures à un seuil donné.", + "long_name": "Fréquence des périodes sèches de {window} jours et plus, pendant lesquelles les précipitations {op:fpl} sur une fenêtre de {window} jours sont inférieures à {thresh}", "description": "Fréquence {freq:f} des périodes sèches de {window} jours et plus, pendant lesquelles les précipitations {op:fpl} sur une fenêtre de {window} jours sont inférieures à {thresh}.", - "long_name": "Fréquence {freq:f} des périodes sèches de {window} jours et plus" + "title": "Fréquence des périodes sèches", + "abstract": "Fréquence des périodes sèches d'une durée minimale donnée, pendant lesquelles les précipitations accumulées ou maximales sur une fenêtre de jours donnée sont inférieures à un seuil donné." }, "DRY_SPELL_TOTAL_LENGTH": { - "title": "Durée totale en jours des périodes séches", - "abstract": "Durée totale en jours des périodes séches de n jours et plus, pendant lesquelles les précipitations accumulées ou maximales sur une fenêtre de n jours sont inférieures à un seuil donné.", - "description": "Durée totale {freq:f} en jours des périodes séches de {window} jours et plus, pendant lesquelles les précipitations {op:fpl} sur une fenêtre de {window} jours sont inférieures à {thresh}.", - "long_name": "Durée totale {freq:f} en jours des périodes sèches de {window} jours et plus" + "long_name": "Durée totale en jours des périodes sèches de {window} jours et plus, pendant lesquelles les précipitations {op:fpl} sur une fenêtre de {window} jours sont inférieures à {thresh}", + "description": "Durée totale {freq:f} en jours des périodes sèches de {window} jours et plus, pendant lesquelles les précipitations {op:fpl} sur une fenêtre de {window} jours sont inférieures à {thresh}.", + "title": "Durée totale en jours des périodes sèches", + "abstract": "Durée totale en jours des périodes sèches d'une durée minimale donnée, pendant lesquelles les précipitations accumulées ou maximales sur une fenêtre de jours donné sont inférieures à un seuil donné." }, "COLD_AND_DRY_DAYS": { - "title": "Nombre de jours froide et secs", - "abstract": "Nombre de jours où la température est en dessous du {tas_per_thresh}e percentile et les précipitations en dessous du {pr_per_thresh}e percentile.", - "description": "Nombre {freq:m} de jours où la température est en dessous du {tas_per_thresh}e percentile et les précipitations en dessous du {pr_per_thresh}e percentile.", - "long_name": "Nombre {freq:m} de jours froids et secs" + "long_name": "Nombre de jours où la température est en dessous du {tas_per_thresh}e centile et la précipitation en dessous du {pr_per_thresh}e centile", + "description": "Nombre {freq:m} de jours où la température est en dessous du {tas_per_thresh}e centile et la précipitation en dessous du {pr_per_thresh}e centile.", + "title": "Nombre de jours froids et secs", + "abstract": "Nombre de jours où la température et la précipitation sont en dessous de centiles donnés." }, "WARM_AND_DRY_DAYS": { + "long_name": "Nombre de jours où la température est au-dessus du {tas_per_thresh}e centile et la précipitation en dessous du {pr_per_thresh}e centile", + "description": "Nombre {freq:m} de jours où la température est au-dessus du {tas_per_thresh}e centile et la précipitation en dessous du {pr_per_thresh}e centile.", "title": "Nombre de jours chauds et secs", - "abstract": "Nombre de jours où la température est au-dessus du {tas_per_thresh}e percentile et les précipitations en dessous du {pr_per_thresh}e percentile.", - "description": "Nombre {freq:m} de jours où la température est au-dessus du {tas_per_thresh}e percentile et les précipitations en dessous du {pr_per_thresh}e percentile.", - "long_name": "Nombre {freq:m} de jours chauds et secs" + "abstract": "Nombre de jours où la température est au-dessus d'un centile donné et la précipitation en dessous d'un centile donné." }, "WARM_AND_WET_DAYS": { + "long_name": "Nombre de jours où la température est au-dessus du {tas_per_thresh}e centile et la précipitation au-dessus du {pr_per_thresh}e centile", + "description": "Nombre {freq:m} de jours où la température est au-dessus du {tas_per_thresh}e centile et la précipitation au-dessus du {pr_per_thresh}e centile.", "title": "Nombre de jours chauds et pluvieux", - "abstract": "Nombre de jours où la température est au-dessus du {tas_per_thresh}e percentile et les précipitations au-dessus du {pr_per_thresh}e percentile.", - "description": "Nombre {freq:m} de jours où la température est au-dessus du {tas_per_thresh}e percentile et les précipitations au-dessus du {pr_per_thresh}e percentile.", - "long_name": "Nombre {freq:m} de jours chauds et pluvieux" + "abstract": "Nombre de jours où la température et la précipitation sont au-dessus de centiles donnés." }, "COLD_AND_WET_DAYS": { + "long_name": "Nombre de jours où la température est en dessous du {tas_per_thresh}e centile et la précipitation au-dessus du {pr_per_thresh}e centile", + "description": "Nombre {freq:m} de jours où la température est en dessous du {tas_per_thresh}e centile et la précipitation au-dessus du {pr_per_thresh}e centile.", "title": "Nombre de jours froids et pluvieux", - "abstract": "Nombre de jours où la température est en dessous du {tas_per_thresh}e percentile et les précipitations au-dessus du {pr_per_thresh}e percentile.", - "description": "Nombre {freq:m} de jours où la température est en dessous du {tas_per_thresh}e percentile et les précipitations au-dessus du {pr_per_thresh}e percentile.", - "long_name": "Nombre {freq:m} de jours froids et pluvieux" + "abstract": "Nombre de jours où la température est en dessous d'un centile donné et la précipitation au-dessus d'un centile donné." }, "CALM_DAYS": { + "long_name": "Nombre de jours où la vitesse du vent de surface est sous {thresh}", + "description": "Nombre {freq:m} de jours où la vitesse du vent de surface est sous {thresh}.", "title": "Nombre de jours de vent calme", - "abstract": "Nombre de jours où la vitesse du vent de surface est en dessous d'un seuil.", - "description": "Nombre {freq:m} de jours où la vitesse du vent de surface < {thresh}.", - "long_name": "Nombre {freq:m} de jours où la vitesse du vent de surface est sous un seuil" + "abstract": "Nombre de jours où la vitesse du vent de surface est sous un seuil donné." }, "WINDY_DAYS": { + "long_name": "Nombre de jours où la vitesse du vent de surface est au-dessus ou égale à {thresh}", + "description": "Nombre {freq:m} de jours où la vitesse du vent de surface est au-dessus ou égale à {thresh}.", "title": "Nombre de jours venteux", - "abstract": "Nombre de jours où la vitesse du vent de surface est au-dessus d'un seuil.", - "description": "Nombre {freq:m} de jours où la vitesse du vent de surface >= {thresh}.", - "long_name": "Nombre {freq:m} de jours où la vitesse du vent de surface est au-dessus d'un seuil" + "abstract": "Nombre de jours où la vitesse du vent de surface est au-dessus ou égale à un seuil donné." }, "JETSTREAM_METRIC_WOOLLINGS": { - "title": "Force et latitude du courant-jet", - "abstract": "Latitude et magnitude du maximum de la vitesse du vent zonal entre 15 à 75°N et -60 à 0°E.", "description": [ - "Latitude journalière du maximum du vent zonal lissé", - "Magnitude journalière du maximum du vent zonal lissé" + "Latitude quotidienne du maximum du vent zonal lissé par un fenêtrage de Lanczos.", + "Magnitude quotidienne du maximum du vent zonal lissé par un fenêtrage de Lanczos." ], "long_name": [ "Latitude du maximum du vent zonal", "Magnitude du maximum du vent zonal" - ] + ], + "title": "Force et latitude du courant-jet", + "abstract": "Latitude et magnitude du maximum de la vitesse du vent zonal entre 15 à 75°N et -60 à 0°E. Le vent est lissé par un fenêtrage de Lanczos." }, "UTCI": { - "title": "Indice universel du climat thermique", - "abstract": "L'UTCI représente la température ressentie par rapport à un environnement de référence et est utilisé pour évaluer le stress thermique à l'extérieur.", + "long_name": "Indice universel du climat thermique [UTCI]", "description": "L'UTCI représente la température ressentie par rapport à un environnement de référence et est utilisé pour évaluer le stress thermique à l'extérieur.", - "long_name": "Indice universel du climat thermique" + "title": "Indice universel du climat thermique [UTCI]", + "abstract": "L'UTCI représente la température ressentie par rapport à un environnement de référence et est utilisé pour évaluer le stress thermique à l'extérieur." }, "MEAN_RADIANT_TEMPERATURE": { - "title": "Température radiative moyenne", - "abstract": "La température moyenne des rayonnements solaires et thermiques incidents sur un corps à l'extérieur.", + "long_name": "Température radiative moyenne", "description": "La température moyenne des rayonnements incidents sur un corps.", - "long_name": "Température radiative moyenne" + "title": "Température radiative moyenne", + "abstract": "La température moyenne des rayonnements solaires et thermiques incidents sur un corps à l'extérieur." } } diff --git a/xclim/indicators/atmos/_conversion.py b/xclim/indicators/atmos/_conversion.py index 10f083ed0..733d0abfb 100644 --- a/xclim/indicators/atmos/_conversion.py +++ b/xclim/indicators/atmos/_conversion.py @@ -45,39 +45,48 @@ def cfcheck(self, **das): humidex = Converter( + title="Humidex", identifier="humidex", units="C", standard_name="air_temperature", - long_name="humidex index", + long_name="Humidex index", description="Humidex index describing the temperature felt by the average person in response to relative humidity.", cell_methods="", + abstract="The humidex describes the temperature felt by a person when relative humidity is taken into account. " + "It can be interpreted as the equivalent temperature felt when the air is dry.", compute=indices.humidex, ) heat_index = Converter( + title="Heat index", identifier="heat_index", units="C", standard_name="air_temperature", - long_name="heat index", + long_name="Heat index", description="Perceived temperature after relative humidity is taken into account.", cell_methods="", + abstract="The heat index is an estimate of the temperature felt by a person in the shade " + "when relative humidity is taken into account.", compute=indices.heat_index, ) tg = Converter( + title="Mean temperature", identifier="tg", units="K", standard_name="air_temperature", long_name="Daily mean temperature", - description="Estimated mean temperature from maximum and minimum temperatures", + description="Estimated mean temperature from maximum and minimum temperatures.", cell_methods="time: mean within days", + abstract="The average daily temperature assuming a symmetrical temperature distribution (Tg = (Tx + Tn) / 2).", compute=indices.tas, ) wind_speed_from_vector = Converter( + title="Wind speed and direction from vector", identifier="wind_speed_from_vector", var_name=["sfcWind", "sfcWindfromdir"], units=["m s-1", "degree"], @@ -87,54 +96,61 @@ def cfcheck(self, **das): "Wind direction computed as the angle of the (uas, vas) vector." " A direction of 0° is attributed to winds with a speed under {calm_wind_thresh}.", ], - long_name=["Near-Surface Wind Speed", "Near-Surface Wind from Direction"], + long_name=["Near-surface wind speed", "Near-surface wind from direction"], cell_methods="", + abstract="Calculation of the magnitude and direction of the wind speed " + "from the two components west-east and south-north.", compute=indices.uas_vas_2_sfcwind, ) wind_vector_from_speed = Converter( + title="Wind vector from speed and direction", identifier="wind_vector_from_speed", var_name=["uas", "vas"], units=["m s-1", "m s-1"], standard_name=["eastward_wind", "northward_wind"], - long_name=["Near-Surface Eastward Wind", "Near-Surface Northward Wind"], + long_name=["Near-surface eastward wind", "Near-surface northward wind"], description=[ - "Eastward wind speed computed from its speed and direction of origin.", - "Northward wind speed computed from its speed and direction of origin.", + "Eastward wind speed computed from the magnitude of its speed and direction of origin.", + "Northward wind speed computed from magnitude of its speed and direction of origin.", ], cell_methods="", + abstract="Calculation of the two components (west-east and north-south) of the wind " + "from the magnitude of its speed and direction of origin.", compute=indices.sfcwind_2_uas_vas, ) saturation_vapor_pressure = Converter( + title="Saturation vapour pressure (e_sat)", identifier="e_sat", units="Pa", - long_name="Saturation vapor pressure", + long_name='Saturation vapour pressure ("{method}" method)', description=lambda **kws: ( - "The saturation vapor pressure was calculated from a temperature " - "according to the {method} method." + "The saturation vapour pressure was calculated from a temperature according to the {method} method." ) + ( " The computation was done in reference to ice for temperatures below {ice_thresh}." if kws["ice_thresh"] is not None else "" ), + abstract="Calculation of the saturation vapour pressure from the temperature, according to a given method. " + "If ice_thresh is given, the calculation is done with reference to ice for temperatures below this threshold.", compute=indices.saturation_vapor_pressure, ) relative_humidity_from_dewpoint = Converter( + title="Relative humidity from temperature and dewpoint temperature", identifier="hurs_fromdewpoint", units="%", var_name="hurs", - long_name="Relative Humidity", + long_name='Relative humidity ("{method}" method)', standard_name="relative_humidity", - title="Relative humidity from temperature and dewpoint temperature.", description=lambda **kws: ( "Computed from temperature, and dew point temperature through the " - "saturation vapor pressures, which were calculated " + "saturation vapour pressures, which were calculated " "according to the {method} method." ) + ( @@ -142,6 +158,7 @@ def cfcheck(self, **das): if kws["ice_thresh"] is not None else "" ), + abstract="Calculation of relative humidity from temperature and dew point using the saturation vapour pressure.", compute=indices.relative_humidity, parameters={ "tdps": {"kind": InputKind.VARIABLE}, @@ -153,22 +170,23 @@ def cfcheck(self, **das): relative_humidity = Converter( + title="Relative humidity from temperature, specific humidity, and pressure", identifier="hurs", units="%", var_name="hurs", - long_name="Relative Humidity", + long_name='Relative Humidity ("{method}" method)', standard_name="relative_humidity", - title="Relative humidity from temperature, pressure and specific humidity.", description=lambda **kws: ( - "Computed from temperature, specific humidity and pressure through the " - "saturation vapor pressure, which was calculated from temperature " - "according to the {method} method." + "Computed from temperature, specific humidity and pressure through the saturation vapour pressure, " + "which was calculated from temperature according to the {method} method." ) + ( " The computation was done in reference to ice for temperatures below {ice_thresh}." if kws["ice_thresh"] is not None else "" ), + abstract="Calculation of relative humidity from temperature, " + "specific humidity, and pressure using the saturation vapour pressure.", compute=indices.relative_humidity, parameters={ "tdps": None, @@ -180,67 +198,79 @@ def cfcheck(self, **das): specific_humidity = Converter( + title="Specific humidity from temperature, relative humidity, and pressure", identifier="huss", units="", var_name="huss", - long_name="Specific Humidity", + long_name='Specific Humidity ("{method}" method)', standard_name="specific_humidity", description=lambda **kws: ( - "Computed from temperature, relative humidity and pressure through the " - "saturation vapor pressure, which was calculated from temperature " - "according to the {method} method." + "Computed from temperature, relative humidity and pressure through the saturation vapour pressure, " + "which was calculated from temperature according to the {method} method." ) + ( " The computation was done in reference to ice for temperatures below {ice_thresh}." if kws["ice_thresh"] is not None else "" ), + abstract="Calculation of specific humidity from temperature, " + "relative humidity, and pressure using the saturation vapour pressure.", compute=indices.specific_humidity, parameters={"invalid_values": "mask"}, ) specific_humidity_from_dewpoint = Converter( + title="Specific humidity from dew point temperature and pressure", identifier="huss_fromdewpoint", units="", - long_name="Specific Humidity", + long_name='Specific humidity ("{method}" method)', standard_name="specific_humidity", description=( "Computed from dewpoint temperature and pressure through the saturation " "vapor pressure, which was calculated according to the {method} method." ), + abstract="Calculation of the specific humidity from dew point temperature " + "and pressure using the saturation vapour pressure.", compute=indices.specific_humidity_from_dewpoint, ) snowfall_approximation = Converter( + title="Snowfall approximation", identifier="prsn", units="kg m-2 s-1", standard_name="solid_precipitation_flux", - long_name="Solid precipitation", + long_name='Solid precipitation ("{method}" method with temperature at or below {thresh})', description=( "Solid precipitation estimated from total precipitation and temperature" " with method {method} and threshold temperature {thresh}." ), + abstract="Solid precipitation estimated from total precipitation and temperature " + "with a given method and temperature threshold.", compute=indices.snowfall_approximation, ) rain_approximation = Converter( + title="Rainfall approximation", identifier="prlp", units="kg m-2 s-1", standard_name="precipitation_flux", - long_name="Liquid precipitation", + long_name='Liquid precipitation ("{method}" method with temperature at or above {thresh})', description=( "Liquid precipitation estimated from total precipitation and temperature" " with method {method} and threshold temperature {thresh}." ), + abstract="Liquid precipitation estimated from total precipitation and temperature " + "with a given method and temperature threshold.", compute=indices.rain_approximation, ) wind_chill_index = Converter( + title="Wind chill", identifier="wind_chill", units="degC", - long_name="Wind chill index", + long_name="Wind chill factor", description=lambda **kws: ( "Wind chill index describing the temperature felt by the average person in response to cold wind." ) @@ -250,54 +280,75 @@ def cfcheck(self, **das): if kws["method"] == "CAN" else "Invalid temperatures (T > 50°F) and winds (V < 3 mph) where masked." ), + abstract="Wind chill factor is an index that equates to how cold an average person feels. " + "It is calculated from the temperature and the wind speed at 10 m. " + "As defined by Environment and Climate Change Canada, a second formula is used for light winds. " + "The standard formula is otherwise the same as used in the United States.", compute=indices.wind_chill_index, parameters={"mask_invalid": True}, ) potential_evapotranspiration = Converter( + title="Potential evapotranspiration", identifier="potential_evapotranspiration", var_name="evspsblpot", units="kg m-2 s-1", standard_name="water_potential_evapotranspiration_flux", - long_name="Potential evapotranspiration", + long_name='Potential evapotranspiration ("{method}" method)', description=( "The potential for water evaporation from soil and transpiration by plants if the water " - "supply is sufficient, with the method {method}." + "supply is sufficient, calculated with the {method} method." + ), + abstract=( + "The potential for water evaporation from soil and transpiration by plants if the water " + "supply is sufficient, calculated with a given method." ), compute=indices.potential_evapotranspiration, ) water_budget_from_tas = Converter( + title="Water budget", identifier="water_budget_from_tas", units="kg m-2 s-1", - long_name="Water budget", + long_name='Water budget ("{method}" method)', description=( "Precipitation minus potential evapotranspiration as a measure of an approximated surface water budget, " - "where the potential evapotranspiration is calculated with the method {method}." + "where the potential evapotranspiration is calculated with the {method} method." + ), + abstract=( + "Precipitation minus potential evapotranspiration as a measure of an approximated surface water budget, " + "where the potential evapotranspiration is calculated with a given method." ), compute=indices.water_budget, ) water_budget = Converter( + title="Water budget", identifier="water_budget", units="kg m-2 s-1", long_name="Water budget", description=( "Precipitation minus potential evapotranspiration as a measure of an approximated surface water budget." ), + abstract=( + "Precipitation minus potential evapotranspiration as a measure of an approximated surface water budget." + ), compute=indices.water_budget, parameters={"method": "dummy"}, ) corn_heat_units = Converter( + title=" Corn heat units", identifier="corn_heat_units", units="", - long_name="Corn heat units (Tmin > {thresh_tasmin} and Tmax > {thresh_tasmax}).", + long_name="Corn heat units (Tmin > {thresh_tasmin} and Tmax > {thresh_tasmax})", description="Temperature-based index used to estimate the development of corn crops. " - "Corn growth occurs when the minimum and maximum daily temperature both exceeds " - "specific thresholds : Tmin > {thresh_tasmin} and Tmax > {thresh_tasmax}.", + "Corn growth occurs when the minimum and maximum daily temperatures both exceed " + "{thresh_tasmin} and {thresh_tasmax}, respectively.", + abstract="A temperature-based index used to estimate the development of corn crops. " + "Corn growth occurs when the daily minimum and maximum temperatures exceed given thresholds.", var_name="chu", cell_methods="", missing="skip", @@ -305,21 +356,26 @@ def cfcheck(self, **das): ) universal_thermal_climate_index = Converter( + title="Universal Thermal Climate Index (UTCI)", identifier="utci", units="K", - long_name="Universal Thermal Climate Index", + long_name="Universal Thermal Climate Index (UTCI)", description="UTCI is the equivalent temperature for the environment derived from a reference environment " "and is used to evaluate heat stress in outdoor spaces.", + abstract="UTCI is the equivalent temperature for the environment derived from a reference environment " + "and is used to evaluate heat stress in outdoor spaces.", cell_methods="", var_name="utci", compute=indices.universal_thermal_climate_index, ) mean_radiant_temperature = Converter( + title="Mean radiant temperature", identifier="mean_radiant_temperature", units="K", long_name="Mean radiant temperature", description="The incidence of radiation on the body from all directions.", + abstract="The average temperature of solar and thermal radiation incident on the body's exterior.", cell_methods="", var_name="mrt", compute=indices.mean_radiant_temperature, diff --git a/xclim/indicators/atmos/_precip.py b/xclim/indicators/atmos/_precip.py index 3265c3f95..0bfb79c0e 100644 --- a/xclim/indicators/atmos/_precip.py +++ b/xclim/indicators/atmos/_precip.py @@ -101,112 +101,125 @@ class HrPrecip(Hourly): rain_on_frozen_ground_days = PrTasxWithIndexing( + title="Number of rain on frozen ground days", identifier="rain_frzgr", units="days", - standard_name="number_of_days_with_lwe_thickness_of_" - "precipitation_amount_above_threshold", - long_name="Number of rain on frozen ground days", - description="{freq} number of days with rain above {thresh} " - "after a series of seven days " - "with average daily temperature below 0℃. " - "Precipitation is assumed to be rain when the" - "daily average temperature is above 0℃.", + standard_name="number_of_days_with_lwe_thickness_of_precipitation_amount_above_threshold", + long_name="Number of rain on frozen ground days (mean daily temperature > 0℃ and precipitation > {thresh})", + description="{freq} number of days with rain above {thresh} after a series of seven days with average daily " + "temperature below 0℃. Precipitation is assumed to be rain when the daily average temperature is above 0℃.", + abstract="The number of days with rain above a given threshold after a series of seven days with average daily " + "temperature below 0°C. Precipitation is assumed to be rain when the daily average temperature is above 0°C.", cell_methods="", compute=indices.rain_on_frozen_ground_days, ) max_1day_precipitation_amount = PrecipWithIndexing( + title="Maximum 1-day total precipitation", identifier="rx1day", units="mm/day", standard_name="lwe_thickness_of_precipitation_amount", - long_name="maximum 1-day total precipitation", + long_name="Maximum 1-day total precipitation", description="{freq} maximum 1-day total precipitation", + abstract="Maximum total daily precipitation for a given period.", cell_methods="time: maximum over days", compute=indices.max_1day_precipitation_amount, ) max_n_day_precipitation_amount = Precip( + title="maximum n-day total precipitation", identifier="max_n_day_precipitation_amount", var_name="rx{window}day", units="mm", standard_name="lwe_thickness_of_precipitation_amount", - long_name="maximum {window}-day total precipitation", - description="{freq} maximum {window}-day total precipitation.", + long_name="maximum {window}-day total precipitation amount", + description="{freq} maximum {window}-day total precipitation amount.", + abstract="Maximum of the moving sum of daily precipitation for a given period.", cell_methods="time: maximum over days", compute=indices.max_n_day_precipitation_amount, ) wetdays = PrecipWithIndexing( + title="Number of wet days", identifier="wetdays", units="days", standard_name="number_of_days_with_lwe_thickness_of_precipitation_amount_at_or_above_threshold", - long_name="Number of wet days (precip >= {thresh})", - description="{freq} number of days with daily precipitation over {thresh}.", + long_name="Number of days with daily precipitation at or above {thresh}", + description="{freq} number of days with daily precipitation at or above {thresh}.", + abstract="The number of days with daily precipitation at or above a given threshold.", cell_methods="time: sum over days", compute=indices.wetdays, ) wetdays_prop = PrecipWithIndexing( + title="Proportion of wet days", identifier="wetdays_prop", units="1", - long_name="Proportion of wet days (precip >= {thresh})", - description="{freq} proportion of days with precipitation over {thresh}.", + long_name="Proportion of days with precipitation at or above {thresh}", + description="{freq} proportion of days with precipitation at or above {thresh}.", + abstract="The proportion of days with daily precipitation at or above a given threshold.", cell_methods="time: sum over days", compute=indices.wetdays_prop, ) dry_days = PrecipWithIndexing( + title="Number of dry days", identifier="dry_days", units="days", standard_name="number_of_days_with_lwe_thickness_of_precipitation_amount_below_threshold", - long_name="Number of dry days (precip < {thresh})", + long_name="Number of dry days", description="{freq} number of days with daily precipitation under {thresh}.", + abstract="The number of days with daily precipitation under a given threshold.", cell_methods="time: sum over days", compute=indices.dry_days, ) maximum_consecutive_wet_days = Precip( + title="Maximum consecutive wet days", identifier="cwd", units="days", - standard_name="number_of_days_with_lwe_thickness_of_" - "precipitation_amount_at_or_above_threshold", - long_name="Maximum consecutive wet days (Precip >= {thresh})", - description="{freq} maximum number of consecutive days with daily " - "precipitation over {thresh}.", + standard_name="number_of_days_with_lwe_thickness_of_precipitation_amount_at_or_above_threshold", + long_name="Maximum consecutive days with daily precipitation at or above {thresh}", + description="{freq} maximum number of consecutive days with daily precipitation at or above {thresh}.", + abstract="The longest number of consecutive days where daily precipitation is at or above a given threshold.", cell_methods="time: sum over days", compute=indices.maximum_consecutive_wet_days, ) maximum_consecutive_dry_days = Precip( + title="Maximum consecutive dry days", identifier="cdd", units="days", - standard_name="number_of_days_with_lwe_thickness_of_" - "precipitation_amount_below_threshold", - long_name="Maximum consecutive dry days (Precip < {thresh})", - description="{freq} maximum number of consecutive days with daily " - "precipitation below {thresh}.", + standard_name="number_of_days_with_lwe_thickness_of_precipitation_amount_below_threshold", + long_name="Maximum consecutive days with daily precipitation below {thresh}", + description="{freq} maximum number of consecutive days with daily precipitation below {thresh}.", + abstract="The longest number of consecutive days where daily precipitation below a given threshold.", cell_methods="time: sum over days", compute=indices.maximum_consecutive_dry_days, ) daily_pr_intensity = PrecipWithIndexing( + title="Simple Daily Intensity Index", identifier="sdii", - units="mm/day", + units="mm d-1", standard_name="lwe_thickness_of_precipitation_amount", - long_name="Average precipitation during wet days (SDII)", - description="{freq} Simple Daily Intensity Index (SDII) : {freq} average precipitation " - "for days with daily precipitation over {thresh}. This indicator is also known as the 'Simple Daily " - "Intensity Index' (SDII).", + long_name="Average precipitation during days with daily precipitation over {thresh} " + "(Simple Daily Intensity Index: SDII)", + description="{freq} Simple Daily Intensity Index (SDII) or " + "{freq} average precipitation for days with daily precipitation over {thresh}.", + abstract="Average precipitation for days with daily precipitation above a given threshold.", cell_methods="", compute=indices.daily_pr_intensity, ) max_pr_intensity = HrPrecip( + title="Maximum precipitation intensity over time window", identifier="max_pr_intensity", - units="mm/h", + units="mm h-1", standard_name="precipitation", - long_name="Maximum precipitation intensity over {window}h duration", - description="{freq} maximum precipitation intensity over rolling {window}h window.", + long_name="Maximum precipitation intensity over rolling {window}h time window", + description="{freq} maximum precipitation intensity over rolling {window}h time window.", + abstract="Maximum precipitation intensity over a given rolling time window.", cell_methods="time: max", compute=indices.max_pr_intensity, duration="{window}", @@ -214,24 +227,29 @@ class HrPrecip(Hourly): ) precip_accumulation = PrecipWithIndexing( - title="Accumulated total precipitation (solid and liquid)", + title="Total accumulated precipitation (solid and liquid)", identifier="prcptot", units="mm", standard_name="lwe_thickness_of_precipitation_amount", - long_name="Total precipitation", - description="{freq} total precipitation", + long_name="Total accumulated precipitation", + description="{freq} total precipitation.", + abstract="Total accumulated precipitation. If the average daily temperature is given, the phase parameter can be " + "used to restrict the calculation to precipitation of only one phase (liquid or solid). Precipitation is " + "considered solid if the average daily temperature is below 0°C (and vice versa).", cell_methods="time: sum over days", compute=indices.precip_accumulation, parameters=dict(tas=None, phase=None), ) wet_precip_accumulation = PrecipWithIndexing( - title="Accumulated total precipitation (solid and liquid) during wet days", + title="Total accumulated precipitation (solid and liquid) during wet days", identifier="wet_prcptot", units="mm", standard_name="lwe_thickness_of_precipitation_amount", - long_name="Total precipitation", + long_name="Total accumulated precipitation over days where precipitation exceeds {thresh}", description="{freq} total precipitation over wet days, defined as days where precipitation exceeds {thresh}.", + abstract="Total accumulated precipitation on days with precipitation. " + "A day is considered to have precipitation if the precipitation is greater than or equal to a given threshold.", cell_methods="time: sum over days", compute=indices.prcptot, parameters={"thresh": {"default": "1 mm/day"}}, @@ -239,24 +257,28 @@ class HrPrecip(Hourly): liquid_precip_accumulation = PrTasxWithIndexing( - title="Accumulated liquid precipitation.", + title="Total accumulated liquid precipitation.", identifier="liquidprcptot", units="mm", standard_name="lwe_thickness_of_liquid_precipitation_amount", - long_name="Total liquid precipitation", - description="{freq} total {phase} precipitation, estimated as precipitation when temperature >= {thresh}", + long_name="Total accumulated precipitation when temperature is above {thresh}", + description="{freq} total {phase} precipitation, estimated as precipitation when temperature is above {thresh}.", + abstract="Total accumulated liquid precipitation. " + "Precipitation is considered liquid when the average daily temperature is above 0°C.", cell_methods="time: sum over days", compute=indices.precip_accumulation, parameters={"tas": {"kind": InputKind.VARIABLE}, "phase": "liquid"}, ) solid_precip_accumulation = PrTasxWithIndexing( - title="Accumulated solid precipitation.", + title="Total accumulated solid precipitation.", identifier="solidprcptot", units="mm", standard_name="lwe_thickness_of_snowfall_amount", - long_name="Total solid precipitation", - description="{freq} total solid precipitation, estimated as precipitation when temperature < {thresh}", + long_name="Total accumulated solid precipitation", + description="{freq} total solid precipitation, estimated as precipitation when temperature at or below {thresh}.", + abstract="Total accumulated solid precipitation. " + "Precipitation is considered solid when the average daily temperature is at or below 0°C.", cell_methods="time: sum over days", compute=indices.precip_accumulation, parameters={"tas": {"kind": InputKind.VARIABLE}, "phase": "solid"}, @@ -268,8 +290,10 @@ class HrPrecip(Hourly): units="", standard_name="spi", long_name="Standardized Precipitation Index (SPI)", - description="Precipitations over rolling window {window}-X window, normalized such that SPI averages to 0 for " - "calibration data. The window unit `X` is the minimal time period defined by resampling frequency {freq}", + description="Precipitations over a moving {window}-X window, normalized such that SPI averages to 0 for " + "calibration data. The window unit `X` is the minimal time period defined by resampling frequency {freq}.", + abstract="Precipitation over a moving window, normalized such that SPI averages to 0 for the calibration data. " + "The window unit `X` is the minimal time period defined by the resampling frequency.", cell_methods="", compute=indices.standardized_precipitation_index, ) @@ -279,24 +303,33 @@ class HrPrecip(Hourly): identifier="spei", units="", standard_name="spei", - long_name="Standardized Precipitation Evapotranspiration Index (SPEI)", - description="Water budget (precipitation - evapotranspiration) over rolling window {window}-X window, normalized such that SPEI averages to 0 for calibration data. The window unit `X` is the minimal time period defined by resampling frequency {freq}", + long_name="Standardized precipitation evapotranspiration index (SPEI)", + description="Water budget (precipitation minus evapotranspiration) over a moving {window}-X window, normalized " + "such that SPEI averages to 0 for calibration data. The window unit `X` is the minimal time period defined by the " + "resampling frequency {freq}.", + abstract="Water budget (precipitation - evapotranspiration) over a moving window, normalized such that the " + "SPEI averages to 0 for the calibration data. The window unit `X` is the minimal time period defined by the " + "resampling frequency.", cell_methods="", compute=indices.standardized_precipitation_evapotranspiration_index, ) drought_code = FireWeather( + title="Daily drought code", identifier="dc", units="", standard_name="drought_code", long_name="Drought Code", - description="Numeric rating of the average moisture content of organic layers.", + description="Numerical code estimating the average moisture content of organic layers.", + abstract="The Drought Index is part of the Canadian Forest-Weather Index system. " + "It is a numerical code that estimates the average moisture content of organic layers.", compute=indices.drought_code, missing="skip", ) fire_weather_indexes = FireWeather( + title="Fire weather indexes", identifier="fwi", realm="atmos", var_name=["dc", "dmc", "ffmc", "isi", "bui", "fwi"], @@ -309,12 +342,12 @@ class HrPrecip(Hourly): "fire_weather_index", ], long_name=[ - "Drought Code", - "Duff Moisture Code", - "Fine Fuel Moisture Code", - "Initial Spread Index", - "Buildup Index", - "Fire Weather Index", + "Drought code", + "Duff moisture code", + "Fine fuel moisture code", + "Initial spread index", + "Buildup index", + "Fire weather index", ], description=[ "Numeric rating of the average moisture content of deep, compact organic layers.", @@ -399,91 +432,112 @@ class HrPrecip(Hourly): last_snowfall = PrecipWithIndexing( + title="Last day where solid precipitation flux exceeded a given threshold", identifier="last_snowfall", standard_name="day_of_year", - long_name="Date of last snowfall", - description="{freq} last day where the solid precipitation flux exceeded {thresh}", + long_name="Date of last day where the solid precipitation flux exceeded {thresh}", + description="{freq} last day where the solid precipitation flux exceeded {thresh}.", + abstract="The last day where the solid precipitation flux exceeded a given threshold during a time period.", units="", compute=indices.last_snowfall, ) first_snowfall = PrecipWithIndexing( + title="First day where solid precipitation flux exceeded a given threshold", identifier="first_snowfall", standard_name="day_of_year", - long_name="Date of first snowfall", - description="{freq} first day where the solid precipitation flux exceeded {thresh}", + long_name="Date of first day where the solid precipitation flux exceeded {thresh}", + description="{freq} first day where the solid precipitation flux exceeded {thresh}.", + abstract="The first day where the solid precipitation flux exceeded a given threshold during a time period.", units="", compute=indices.first_snowfall, ) days_with_snow = PrecipWithIndexing( - identifier="days_with_snow", title="Days with snowfall", - long_name="Number of days with solid precipitation flux between low and high thresholds.", + identifier="days_with_snow", + long_name="Number of days with solid precipitation flux between {low} and {high} thresholds", description="{freq} number of days with solid precipitation flux larger than {low} and smaller or equal to {high}.", + abstract="Number of days with snow between a lower and upper limit.", units="days", compute=indices.days_with_snow, ) +# FIXME: Are days_over_precip_thresh and days_over_precip_doy_thresh the same thing? days_over_precip_thresh = PrecipWithIndexing( + title="Number of days with precipitation above a given percentile", identifier="days_over_precip_thresh", standard_name="number_of_days_with_lwe_thickness_of_precipitation_amount_above_threshold", - description="{freq} number of days with precipitation above the {pr_per_thresh}th" - " percentile of {pr_per_period} period." - " Only days with at least {thresh} are counted.", + long_name="Number of days with precipitation flux above the {pr_per_thresh}th percentile of {pr_per_period}", + description="{freq} number of days with precipitation above the {pr_per_thresh}th percentile of {pr_per_period} " + "period. Only days with at least {thresh} are counted.", + abstract="Number of days in a period where precipitation is above a given percentile, " + "calculated over a given period and a fixed threshold.", units="days", cell_methods="time: sum over days", compute=indices.days_over_precip_thresh, ) +# FIXME: Are days_over_precip_thresh and days_over_precip_doy_thresh the same thing? days_over_precip_doy_thresh = PrecipWithIndexing( + title="Number of days with precipitation above a given daily percentile", identifier="days_over_precip_doy_thresh", standard_name="number_of_days_with_lwe_thickness_of_precipitation_amount_above_daily_threshold", - description="{freq} number of days with precipitation above the {pr_per_thresh}th daily percentile." - " Only days with at least {thresh} are counted." - " A {pr_per_window} day(s) window, centred on each calendar day in the" - " {pr_per_period} period, is used to compute the {pr_per_thresh}th percentile(s).", + long_name="Number of days with daily precipitation flux above the {pr_per_thresh}th percentile of {pr_per_period}", + description="{freq} number of days with precipitation above the {pr_per_thresh}th daily percentile. Only days with " + "at least {thresh} are counted. A {pr_per_window} day(s) window, centered on each calendar day in the " + "{pr_per_period} period, is used to compute the {pr_per_thresh}th percentile(s).", + abstract="Number of days in a period where precipitation is above a given daily percentile and a fixed threshold.", units="days", cell_methods="time: sum over days", compute=indices.days_over_precip_thresh, ) high_precip_low_temp = PrTasxWithIndexing( + title="Days with precipitation and cold temperature", identifier="high_precip_low_temp", - description="{freq} number of days with precipitation above {pr_thresh} and temperature below {tas_thresh}.", + long_name="Days with precipitation at or above {pr_thresh} and temperature below {tas_thresh}", + description="{freq} number of days with precipitation at or above {pr_thresh} and temperature below {tas_thresh}.", + abstract="Number of days with precipitation above a given threshold and temperature below a given threshold.", units="days", cell_methods="time: sum over days", compute=indices.high_precip_low_temp, ) +# FIXME: Are fraction_over_precip_thresh and fraction_over_precip_doy_thresh the same thing? +# FIXME: Clarity needed in both French and English metadata fields fraction_over_precip_doy_thresh = PrecipWithIndexing( + title="", identifier="fraction_over_precip_doy_thresh", - description="{freq} fraction of total precipitation due to days with precipitation" - " above {pr_per_thresh}th daily percentile." - " Only days with at least {thresh} are included in the total." - " A {pr_per_window} day(s) window, centred on each calendar day in the" - " {pr_per_period} period, is used to compute the {pr_per_thresh}th percentile(s).", + long_name="Fraction of precipitation due to days with daily precipitation above {pr_per_thresh}th daily percentile", + description="{freq} fraction of total precipitation due to days with precipitation above {pr_per_thresh}th daily " + "percentile. Only days with at least {thresh} are included in the total. A {pr_per_window} day(s) window, centered " + "on each calendar day in the {pr_per_period} period, is used to compute the {pr_per_thresh}th percentile(s).", units="", cell_methods="", compute=indices.fraction_over_precip_thresh, ) +# FIXME: Are fraction_over_precip_thresh and fraction_over_precip_doy_thresh the same thing? +# FIXME: Clarity needed in both French and English metadata fields fraction_over_precip_thresh = PrecipWithIndexing( identifier="fraction_over_precip_thresh", - description="{freq} fraction of total precipitation due to days with precipitation" - " above {pr_per_thresh}th percentile of {pr_per_period} period." - " Only days with at least {thresh} are included in the total.", + long_name="Fraction of precipitation due to days with precipitation above {pr_per_thresh}th daily percentile", + description="{freq} fraction of total precipitation due to days with precipitation above {pr_per_thresh}th " + "percentile of {pr_per_period} period. Only days with at least {thresh} are included in the total.", units="", cell_methods="", compute=indices.fraction_over_precip_thresh, ) liquid_precip_ratio = PrTasxWithIndexing( + title="Fraction of liquid to total precipitation", identifier="liquid_precip_ratio", - description="{freq} ratio of rainfall to total precipitation." - " Rainfall is estimated as precipitation on days where temperature is above {thresh}.", - abstract="The ratio of total liquid precipitation over the total precipitation. Liquid precipitation is" - " approximated from total precipitation on days where temperature is above a threshold.", + long_name="Fraction of liquid to total precipitation (temperature above {thresh})", + description="The {freq} ratio of rainfall to total precipitation. Rainfall is estimated as precipitation on days " + "where temperature is above {thresh}.", + abstract="The ratio of total liquid precipitation over the total precipitation. Liquid precipitation is " + "approximated from total precipitation on days where temperature is above a given threshold.", units="", compute=indices.liquid_precip_ratio, parameters={"tas": {"kind": InputKind.VARIABLE}, "prsn": None}, @@ -491,9 +545,14 @@ class HrPrecip(Hourly): dry_spell_frequency = Precip( + title="Dry spell frequency", identifier="dry_spell_frequency", - description="The {freq} number of dry periods of {window} days and more, during which the {op} precipitation " - "on a window of {window} days is under {thresh}.", + long_name="Number of dry periods of {window} day(s) or more, during which the {op} precipitation on a " + "window of {window} day(s) is below {thresh}.", + description="The {freq} number of dry periods of {window} day(s) or more, during which the {op} precipitation on a " + "window of {window} day(s) is below {thresh}.", + abstract="The frequency of dry periods of `N` days or more, during which the accumulated or maximum precipitation " + "over a given time window of days is below a given threshold.", units="", cell_methods="", compute=indices.dry_spell_frequency, @@ -501,17 +560,28 @@ class HrPrecip(Hourly): dry_spell_total_length = Precip( + title="Dry spell total length", identifier="dry_spell_total_length", - description="The {freq} number of days in dry periods of {window} days and more, during which the {op}" - "precipitation within windows of {window} days is under {thresh}.", + long_name="Number of days in dry periods of {window} day(s) or more, during which the {op} " + "precipitation within windows of {window} day(s) is under {thresh}.", + description="The {freq} number of days in dry periods of {window} day(s) or more, during which the {op} " + "precipitation within windows of {window} day(s) is under {thresh}.", + abstract="The total length of dry periods of `N` days or more, during which the accumulated or maximum " + "precipitation over a given time window of days is below a given threshold.", units="days", cell_methods="", compute=indices.dry_spell_total_length, ) rprctot = PrecipWithIndexing( + title="Proportion of accumulated precipitation arising from convective processes", identifier="rprctot", - description="Proportion of accumulated precipitation arising from convective processes.", + long_name="Proportion of accumulated precipitation arising from convective processes" + "with precipitation of at least {thresh}", + description="{freq} proportion of accumulated precipitation arising from convective processes " + "with precipitation of at least {thresh}.", + abstract="The proportion of total precipitation due to convective processes. " + "Only days with surpassing a minimum precipitation flux are considered.", units="", cell_methods="time: sum", compute=indices.rprctot, @@ -519,41 +589,53 @@ class HrPrecip(Hourly): cold_and_dry_days = PrecipWithIndexing( + title="Cold and dry days", identifier="cold_and_dry_days", units="days", - long_name="Cold and dry days", - title="Cold and dry days", - description="{freq} number of days where tas < {tas_per_thresh}th percentile and pr < {pr_per_thresh}th percentile", + long_name="Number of days where temperature is below {tas_per_thresh}th percentile and " + "precipitation is below {pr_per_thresh}th percentile", + description="{freq} number of days where temperature is below {tas_per_thresh}th percentile and " + "precipitation is below {pr_per_thresh}th percentile.", + abstract="Number of days with temperature below a given percentile and precipitation below a given percentile.", cell_methods="time: sum over days", compute=indices.cold_and_dry_days, ) warm_and_dry_days = PrecipWithIndexing( + title="Warm and dry days", identifier="warm_and_dry_days", units="days", - long_name="warm and dry days", - title="warm and dry days", - description="{freq} number of days where tas > {tas_per_thresh}th percentile and pr < {pr_per_thresh}th percentile", + long_name="Number of days where temperature is above {tas_per_thresh}th percentile and " + "precipitation is below {pr_per_thresh}th percentile", + description="{freq} number of days where temperature is above {tas_per_thresh}th percentile and " + "precipitation is below {pr_per_thresh}th percentile.", + abstract="Number of days with temperature above a given percentile and precipitation below a given percentile.", cell_methods="time: sum over days", compute=indices.warm_and_dry_days, ) warm_and_wet_days = PrecipWithIndexing( + title="Warm and wet days", identifier="warm_and_wet_days", units="days", - long_name="warm and wet days", - title="warm and wet days", - description="{freq} number of days where tas > {tas_per_thresh}th percentile and pr > {pr_per_thresh}th percentile", + long_name="Number of days where temperature above {tas_per_thresh}th percentile and " + "precipitation above {pr_per_thresh}th percentile", + description="{freq} number of days where temperature is above {tas_per_thresh}th percentile and " + "precipitation is above {pr_per_thresh}th percentile.", + abstract="Number of days with temperature above a given percentile and precipitation above a given percentile.", cell_methods="time: sum over days", compute=indices.warm_and_wet_days, ) cold_and_wet_days = PrecipWithIndexing( + title="Cold and wet days", identifier="cold_and_wet_days", units="days", - long_name="cold and wet days", - title="cold and wet days", - description="{freq} number of days where tas < {tas_per_thresh}th percentile and pr > {pr_per_thresh}th percentile", + long_name="Number of days where temperature is below {tas_per_thresh}th percentile and " + "precipitation is above {pr_per_thresh}th percentile", + description="{freq} number of days where temperature is below {tas_per_thresh}th percentile and " + "precipitation is above {pr_per_thresh}th percentile.", + abstract="Number of days with temperature below a given percentile and precipitation above a given percentile.", cell_methods="time: sum over days", compute=indices.cold_and_wet_days, ) diff --git a/xclim/indicators/atmos/_synoptic.py b/xclim/indicators/atmos/_synoptic.py index 72e85981d..b4aeb065c 100644 --- a/xclim/indicators/atmos/_synoptic.py +++ b/xclim/indicators/atmos/_synoptic.py @@ -14,6 +14,7 @@ class JetStream(Indicator): jetstream_metric_woollings = JetStream( + title="Strength and latitude of jetstream", identifier="jetstream_metric_woollings", var_name=["jetlat", "jetstr"], units=["degrees_North", "m s-1"], @@ -22,8 +23,8 @@ class JetStream(Indicator): "Maximum strength of smoothed zonal wind speed", ], description=[ - "Daily latitude of maximum smoothed zonal wind speed", - "Daily maximum strength of smoothed zonal wind speed", + "Daily latitude of maximum Lanczos smoothed zonal wind speed.", + "Daily maximum strength of Lanczos smoothed zonal wind speed.", ], compute=indices.jetstream_metric_woollings, ) diff --git a/xclim/indicators/atmos/_temperature.py b/xclim/indicators/atmos/_temperature.py index ae9b3c8b4..a4affe4a4 100644 --- a/xclim/indicators/atmos/_temperature.py +++ b/xclim/indicators/atmos/_temperature.py @@ -96,126 +96,143 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): tn_days_above = TempWithIndexing( + title="Number of days with minimum temperature above a given threshold", identifier="tn_days_above", units="days", standard_name="number_of_days_with_air_temperature_above_threshold", - long_name="Number of days with Tmin > {thresh}", + long_name="The number of days with minimum temperature above {thresh}", description="{freq} number of days where daily minimum temperature exceeds {thresh}.", + abstract="The number of days with minimum temperature above a given threshold.", cell_methods="time: sum over days", compute=indices.tn_days_above, - parameters=dict(op=">"), + parameters={"op": {"default": ">"}}, ) tn_days_below = TempWithIndexing( + title="Number of days with minimum temperature below a given threshold", identifier="tn_days_below", units="days", standard_name="number_of_days_with_air_temperature_below_threshold", - long_name="Number of days with Tmin < {thresh}", + long_name="The number of days with minimum temperature below {thresh}", description="{freq} number of days where daily minimum temperature is below {thresh}.", + abstract="The number of days with minimum temperature below a given threshold.", cell_methods="time: sum over days", compute=indices.tn_days_below, - parameters=dict(op="<"), + parameters={"op": {"default": "<"}}, ) tg_days_above = TempWithIndexing( + title="Number of days with mean temperature above a given threshold", identifier="tg_days_above", units="days", standard_name="number_of_days_with_air_temperature_above_threshold", - long_name="Number of days with Tavg > {thresh}", + long_name="The number of days with mean temperature above {thresh}", description="{freq} number of days where daily mean temperature exceeds {thresh}.", + abstract="The number of days with mean temperature above a given threshold.", cell_methods="time: sum over days", compute=indices.tg_days_above, - parameters=dict(op=">"), + parameters={"op": {"default": ">"}}, ) tg_days_below = TempWithIndexing( + title="Number of days with mean temperature below a given threshold", identifier="tg_days_below", units="days", standard_name="number_of_days_with_air_temperature_below_threshold", - long_name="Number of days with Tavg < {thresh}", + long_name="The number of days with mean temperature below {thresh}", description="{freq} number of days where daily mean temperature is below {thresh}.", + abstract="The number of days with mean temperature below a given threshold.", cell_methods="time: sum over days", compute=indices.tg_days_below, - parameters=dict(op="<"), + parameters={"op": {"default": "<"}}, ) tx_days_above = TempWithIndexing( + title="Number of days with maximum temperature above a given threshold", identifier="tx_days_above", units="days", standard_name="number_of_days_with_air_temperature_above_threshold", - long_name="Number of days with Tmax > {thresh}", + long_name="The number of days with maximum temperature above {thresh}", description="{freq} number of days where daily maximum temperature exceeds {thresh}.", + abstract="The number of days with maximum temperature above a given threshold.", cell_methods="time: sum over days", compute=indices.tx_days_above, - parameters=dict(op=">"), + parameters={"op": {"default": ">"}}, ) tx_days_below = TempWithIndexing( + title="Number of days with maximum temperature below a given threshold", identifier="tx_days_below", units="days", standard_name="number_of_days_with_air_temperature_below_threshold", - long_name="Number of days with Tmax < {thresh}", + long_name="The number of days with maximum temperature below {thresh}", description="{freq} number of days where daily max temperature is below {thresh}.", + abstract="The number of days with maximum temperature below a given threshold.", cell_methods="time: sum over days", compute=indices.tx_days_below, - parameters=dict(op="<"), + parameters={"op": {"default": "<"}}, ) tx_tn_days_above = TempWithIndexing( + title="Number of days with daily minimum and maximum temperatures exceeding thresholds", identifier="tx_tn_days_above", units="days", standard_name="number_of_days_with_air_temperature_above_threshold", - long_name="Number of days with Tmax > {thresh_tasmax} and Tmin > {thresh_tasmin}", - description="{freq} number of days where daily maximum temperature exceeds " - "{thresh_tasmax} and minimum temperature exceeds {thresh_tasmin}.", + long_name="Number of days with daily minimum above {thresh_tasmin} " + "and daily maximum temperatures above {thresh_tasmax}", + description="{freq} number of days where daily maximum temperature exceeds {thresh_tasmax} and minimum temperature " + "exceeds {thresh_tasmin}.", + abstract="Number of days with daily maximum and minimum temperatures above given thresholds.", cell_methods="", compute=indices.tx_tn_days_above, ) heat_wave_frequency = Temp( + title="Heat wave frequency", identifier="heat_wave_frequency", units="", standard_name="heat_wave_events", - long_name="Number of heat wave events (Tmin > {thresh_tasmin} " - "and Tmax > {thresh_tasmax} for >= {window} days)", - description="{freq} number of heat wave events over a given period. " - "An event occurs when the minimum and maximum daily " - "temperature both exceeds specific thresholds : " - "(Tmin > {thresh_tasmin} and Tmax > {thresh_tasmax}) " - "over a minimum number of days ({window}).", + long_name="Total number of series of at least {window} consecutive days with daily minimum temperature above " + "{thresh_tasmin} and daily maximum temperature above {thresh_tasmax}", + description="{freq} number of heat wave events within a given period. A heat wave occurs when daily minimum and " + "maximum temperatures exceed {thresh_tasmin} and {thresh_tasmax}, respectively, over at least {window} days.", + abstract="Number of heat waves. A heat wave occurs when daily minimum and maximum temperatures exceed given " + "thresholds for a number of days.", cell_methods="", keywords="health,", compute=indices.heat_wave_frequency, ) heat_wave_max_length = Temp( + title="Heat wave maximum length", identifier="heat_wave_max_length", units="days", standard_name="spell_length_of_days_with_air_temperature_above_threshold", - long_name="Maximum length of heat wave events (Tmin > {thresh_tasmin}" - "and Tmax > {thresh_tasmax} for >= {window} days)", - description="{freq} maximum length of heat wave events occurring in a given period. " - "An event occurs when the minimum and maximum daily " - "temperature both exceeds specific thresholds " - "(Tmin > {thresh_tasmin} and Tmax > {thresh_tasmax}) over " - "a minimum number of days ({window}).", + long_name="Longest series of at least {window} consecutive days with daily minimum temperature above " + "{thresh_tasmin} and daily maximum temperature above {thresh_tasmax}", + description="{freq} maximum length of heat wave events occurring within a given period. " + "A heat wave occurs when daily minimum and maximum temperatures exceed {thresh_tasmin} and {thresh_tasmax}, " + "respectively, over at least {window} days.", + abstract="Total duration of heat waves. A heat wave occurs when daily minimum and maximum temperatures exceed " + "given thresholds for a number of days.", cell_methods="", keywords="health,", compute=indices.heat_wave_max_length, ) heat_wave_total_length = Temp( + title="Heat wave total length", identifier="heat_wave_total_length", units="days", standard_name="spell_length_of_days_with_air_temperature_above_threshold", - long_name="Total length of heat wave events (Tmin > {thresh_tasmin} " - "and Tmax > {thresh_tasmax} for >= {window} days)", - description="{freq} total length of heat wave events occurring in a given period. " - "An event occurs when the minimum and maximum daily " - "temperature both exceeds specific thresholds " - "(Tmin > {thresh_tasmin} and Tmax > {thresh_tasmax}) over " - "a minimum number of days ({window}).", + long_name="Total length of events of at least {window} consecutive days with daily minimum temperature above " + "{thresh_tasmin} and daily maximum temperature above {thresh_tasmax}", + description="{freq} total length of heat wave events occurring within a given period. " + "A heat wave occurs when daily minimum and maximum temperatures exceed {thresh_tasmin} and {thresh_tasmax}, " + "respectively, over at least {window} days.", + abstract="Maximum length of heat waves. A heat wave occurs when daily minimum and maximum temperatures exceed " + "given thresholds for a number of days.", cell_methods="", keywords="health,", compute=indices.heat_wave_total_length, @@ -223,237 +240,284 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): heat_wave_index = Temp( + title="Heat wave index", identifier="heat_wave_index", units="days", standard_name="heat_wave_index", - long_name="Number of days that are part of a heatwave", - description="{freq} number of days that are part of a heatwave, " - "defined as five or more consecutive days over {thresh}.", + long_name="Total number of days constituting events of at least {window} consecutive days " + "with daily maximum temperature above {thresh}", + description="{freq} total number of days that are part of a heatwave within a given period. " + "A heat wave occurs when daily maximum temperatures exceed {thresh} over at least {window} days.", + abstract="Number of days that constitute heatwave events. A heat wave occurs when daily minimum and maximum " + "temperatures exceed given thresholds for a number of days.", cell_methods="", compute=indices.heat_wave_index, ) hot_spell_frequency = Temp( + title="Hot spell frequency", identifier="hot_spell_frequency", units="", standard_name="hot_spell_events", - long_name="Number of hot spell events (Tmax > {thresh_tasmax} for >= {window} days)", - description="{freq} number of hot spell events over a given period. " - "An event occurs when the maximum daily temperature exceeds a specific threshold: (Tmax > {thresh_tasmax}) " - "over a minimum number of days ({window}).", + long_name="Total number of series of at least {window} consecutive days " + "with daily maximum temperature above {thresh_tasmax}", + description="{freq} number of hot spell events within a given period. A hot spell event occurs when the maximum " + "daily temperature exceeds {thresh_tasmax} over at least {window} days.", + abstract="Number of hot spells events within a given period. A hot spell occurs when the daily maximum temperature" + "exceeds a given threshold for a minimum number of days.", cell_methods="", keywords="health,", compute=indices.hot_spell_frequency, ) hot_spell_max_length = Temp( + title="Hot spell maximum length", identifier="hot_spell_max_length", units="days", standard_name="spell_length_of_days_with_air_temperature_above_threshold", - long_name="Maximum length of hot spell events (Tmax > {thresh_tasmax} for >= {window} days)", - description="{freq} maximum length of hot spell events occurring in a given period. " - "An event occurs when the maximum daily temperature exceeds a specific threshold: (Tmax > {thresh_tasmax}) " - "over a minimum number of days ({window}).", + long_name="Longest series of at least {window} consecutive days " + "with daily maximum temperature above {thresh_tasmax}", + description="{freq} maximum length of hot spell events occurring within a given period. " + "A hot spell event occurs when the maximum daily temperature exceeds {thresh_tasmax} over at least {window} days.", + abstract="Maximum length of hot spells events within a given period. A hot spell occurs when the daily maximum " + "temperature exceeds a given threshold for a minimum number of days.", cell_methods="", keywords="health,", compute=indices.hot_spell_max_length, ) tg_mean = TempWithIndexing( + title="Mean temperature", identifier="tg_mean", units="K", standard_name="air_temperature", long_name="Mean daily mean temperature", description="{freq} mean of daily mean temperature.", + abstract="Mean of daily mean temperature.", cell_methods="time: mean over days", compute=indices.tg_mean, ) tg_max = TempWithIndexing( + title="Maximum of mean temperature", identifier="tg_max", units="K", standard_name="air_temperature", long_name="Maximum daily mean temperature", description="{freq} maximum of daily mean temperature.", + abstract="Maximum of daily mean temperature.", cell_methods="time: maximum over days", compute=indices.tg_max, ) tg_min = TempWithIndexing( + title="Minimum of mean temperature", identifier="tg_min", units="K", standard_name="air_temperature", long_name="Minimum daily mean temperature", description="{freq} minimum of daily mean temperature.", + abstract="Minimum of daily mean temperature.", cell_methods="time: minimum over days", compute=indices.tg_min, ) tx_mean = TempWithIndexing( + title="Mean of maximum temperature", identifier="tx_mean", units="K", standard_name="air_temperature", long_name="Mean daily maximum temperature", description="{freq} mean of daily maximum temperature.", + abstract="Mean of daily maximum temperature.", cell_methods="time: mean over days", compute=indices.tx_mean, ) tx_max = TempWithIndexing( + title="Maximum temperature", identifier="tx_max", units="K", standard_name="air_temperature", long_name="Maximum daily maximum temperature", description="{freq} maximum of daily maximum temperature.", + abstract="Maximum of daily maximum temperature.", cell_methods="time: maximum over days", compute=indices.tx_max, ) tx_min = TempWithIndexing( + title="Minimum of maximum temperature", identifier="tx_min", units="K", standard_name="air_temperature", long_name="Minimum daily maximum temperature", description="{freq} minimum of daily maximum temperature.", + abstract="Minimum of daily maximum temperature.", cell_methods="time: minimum over days", compute=indices.tx_min, ) tn_mean = TempWithIndexing( + title="Mean of minimum temperature", identifier="tn_mean", units="K", standard_name="air_temperature", long_name="Mean daily minimum temperature", description="{freq} mean of daily minimum temperature.", + abstract="Mean of daily minimum temperature.", cell_methods="time: mean over days", compute=indices.tn_mean, ) tn_max = TempWithIndexing( + title="Maximum of minimum temperature", identifier="tn_max", units="K", standard_name="air_temperature", long_name="Maximum daily minimum temperature", description="{freq} maximum of daily minimum temperature.", + abstract="Maximum of daily minimum temperature.", cell_methods="time: maximum over days", compute=indices.tn_max, ) tn_min = TempWithIndexing( + title="Minimum temperature", identifier="tn_min", units="K", standard_name="air_temperature", long_name="Minimum daily minimum temperature", description="{freq} minimum of daily minimum temperature.", + abstract="Minimum of daily minimum temperature.", cell_methods="time: minimum over days", compute=indices.tn_min, ) daily_temperature_range = TempWithIndexing( - title="Mean of daily temperature range.", + title="Mean of daily temperature range", identifier="dtr", units="K", standard_name="air_temperature", - long_name="Mean Diurnal Temperature Range", + long_name="Mean diurnal temperature range", description="{freq} mean diurnal temperature range.", cell_methods="time range within days time: mean over days", + abstract="The average difference between the daily maximum and minimum temperatures.", compute=indices.daily_temperature_range, - parameters=dict(op="mean"), + parameters={"op": "mean"}, ) max_daily_temperature_range = TempWithIndexing( - title="Maximum of daily temperature range.", + title="Maximum of daily temperature range", identifier="dtrmax", units="K", standard_name="air_temperature", - long_name="Maximum Diurnal Temperature Range", + long_name="Maximum diurnal temperature range", description="{freq} maximum diurnal temperature range.", cell_methods="time range within days time: max over days", + abstract="The maximum difference between the daily maximum and minimum temperatures.", compute=indices.daily_temperature_range, - parameters=dict(op="max"), + parameters={"op": "max"}, ) daily_temperature_range_variability = TempWithIndexing( + title="Variability of daily temperature range", identifier="dtrvar", units="K", standard_name="air_temperature", - long_name="Mean Diurnal Temperature Range Variability", - description="{freq} mean diurnal temparature range variability " - "(defined as the average day-to-day variation " - "in daily temperature range " - "for the given time period)", - cell_methods="time range within days time: difference " - "over days time: mean over days", + long_name="Mean diurnal temperature range variability", + description="{freq} mean diurnal temperature range variability, defined as the average day-to-day variation " + "in daily temperature range for the given time period.", + abstract="The average day-to-day variation in daily temperature range.", + cell_methods="time range within days time: difference over days time: mean over days", compute=indices.daily_temperature_range_variability, ) extreme_temperature_range = TempWithIndexing( + title="Extreme temperature range", identifier="etr", units="K", standard_name="air_temperature", - long_name="Intra-period Extreme Temperature Range", - description="{freq} range between the maximum of daily max temperature " - "(tx_max) and the minimum of daily min temperature (tn_min)", + long_name="Intra-period extreme temperature range", + description="{freq} range between the maximum of daily maximum temperature and the minimum of daily" + "minimum temperature.", + abstract="The maximum of the maximum temperature minus the minimum of the minimum temperature.", compute=indices.extreme_temperature_range, ) cold_spell_duration_index = Temp( + title="Cold Spell Duration Index (CSDI)", identifier="cold_spell_duration_index", var_name="csdi_{window}", units="days", standard_name="cold_spell_duration_index", - long_name="Number of days part of a percentile-defined cold spell", - description="{freq} number of days with at least {window} consecutive days " - "where the daily minimum temperature is below the {tasmin_per_thresh}th " - "percentile(s). A {tasmin_per_window} day(s) window, centred on each calendar day in the " - "{tasmin_per_period} period, is used to compute the {tasmin_per_thresh}th percentile(s).", + long_name="Total number of days constituting events of at least {window} consecutive days " + "where the daily minimum temperature is below the {tasmin_per_thresh}th percentile", + description="{freq} number of days with at least {window} consecutive days where the daily minimum temperature " + "is below the {tasmin_per_thresh}th percentile. A {tasmin_per_window} day(s) window, centred on each calendar day " + "in the {tasmin_per_period} period, is used to compute the {tasmin_per_thresh}th percentile(s).", + abstract="Number of days part of a percentile-defined cold spell. A cold spell occurs when the daily minimum " + "temperature is below a given percentile for a given number of consecutive days.", cell_methods="", compute=indices.cold_spell_duration_index, ) cold_spell_days = Temp( + title="Cold spell days", identifier="cold_spell_days", units="days", standard_name="cold_spell_days", - long_name="Number of days part of a cold spell", - description="{freq} number of days that are part of a cold spell, defined as {window} " - "or more consecutive days with mean daily " - "temperature below {thresh}.", + long_name="Total number of days constituting events of at least {window} consecutive days " + "where the mean daily temperature is below {thresh}", + description="{freq} number of days that are part of a cold spell. A cold spell is defined as {window} or more " + "consecutive days with mean daily temperature below {thresh}.", + abstract="The number of days that are part of a cold spell. A cold spell is defined as a minimum number of " + "consecutive days with mean daily temperature below a given threshold.", cell_methods="", compute=indices.cold_spell_days, ) cold_spell_frequency = Temp( + title="Cold spell frequency", identifier="cold_spell_frequency", units="", standard_name="cold_spell_frequency", - long_name="Number of cold spell events", - description="{freq} number cold spell events, defined as {window} " - "or more consecutive days with mean daily " - "temperature below {thresh}.", + long_name="Total number of series of at least {window} consecutive days " + "where the mean daily temperature is below {thresh}", + description="{freq} number cold spell events. A cold spell is defined as a minimum number of " + "consecutive days with mean daily temperature below {thresh}.", + abstract="The number of cold spell events. A cold spell is defined as a minimum number of consecutive days with " + "mean daily temperature below a given threshold.", cell_methods="", compute=indices.cold_spell_frequency, ) cool_night_index = Temp( + title="Cool night index", identifier="cool_night_index", units="degC", - long_name="cool night index", + long_name="Cool night index", + # FIXME: Section formatting will shift these month names to all lowercase. description="Mean minimum temperature for September (northern hemisphere) or March (southern hemisphere).", - cell_methods="time: mean over days", abstract="A night coolness variable which takes into account the mean minimum night temperatures during the " "month when ripening usually occurs beyond the ripening period.", + cell_methods="time: mean over days", allowed_periods=["A"], compute=indices.cool_night_index, ) daily_freezethaw_cycles = TempWithIndexing( + title="Daily freeze-thaw cycles", identifier="dlyfrzthw", units="days", - long_name="daily freezethaw cycles", - description="{freq} number of days with a diurnal freeze-thaw cycle " - ": Tmax {op_tasmax} {thresh_tasmax} and Tmin {op_tasmin} {thresh_tasmin}.", + long_name="Number of days where maximum daily temperatures are above {thresh_tasmax} " + "and minimum daily temperatures are at or below {thresh_tasmin}", + description="{freq} number of days with a diurnal freeze-thaw cycle, where maximum daily temperatures are above " + "{thresh_tasmax} and minimum daily temperatures are at or below {thresh_tasmin}.", + abstract="The number of days with a freeze-thaw cycle. A freeze-thaw cycle is defined as a day where maximum daily " + "temperature is above a given threshold and minimum daily temperature is at or below a given threshold, " + "usually 0°C for both.", cell_methods="", compute=indices.multiday_temperature_swing, parameters={ @@ -461,40 +525,47 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): "window": 1, "thresh_tasmax": {"default": "0 degC"}, "thresh_tasmin": {"default": "0 degC"}, - "op_tasmax": ">", - "op_tasmin": "<=", + "op_tasmax": {"default": ">"}, + "op_tasmin": {"default": "<="}, }, ) freezethaw_spell_frequency = Temp( + title="Freeze-thaw spell frequency", identifier="freezethaw_spell_frequency", - title="Frequency of freeze-thaw spells", units="days", - long_name="{freq} number of freeze-thaw spells.", - description="{freq} number of freeze-thaw spells" - ": Tmax {op_tasmax} {thresh_tasmax} and Tmin {op_tasmin} {thresh_tasmin} " - "for at least {window} consecutive day(s).", + long_name="Frequency of events where maximum daily temperatures are above {thresh_tasmax} " + "and minimum daily temperatures are at or below {thresh_tasmin} for at least {window} consecutive day(s).", + description="{freq} number of freeze-thaw spells, where maximum daily temperatures are above {thresh_tasmax} " + "and minimum daily temperatures are at or below {thresh_tasmin} for at least {window} consecutive day(s).", + abstract="Frequency of daily freeze-thaw spells. A freeze-thaw spell is defined as a number of consecutive days " + "where maximum daily temperatures are above a given threshold and minimum daily temperatures are at or below a " + "given threshold, usually 0°C for both.", cell_methods="", compute=indices.multiday_temperature_swing, parameters={ "op": "count", "thresh_tasmax": {"default": "0 degC"}, "thresh_tasmin": {"default": "0 degC"}, - "op_tasmax": ">", - "op_tasmin": "<=", + "op_tasmax": {"default": ">"}, + "op_tasmin": {"default": "<="}, }, ) freezethaw_spell_mean_length = Temp( + title="Freeze-thaw spell mean length", identifier="freezethaw_spell_mean_length", - title="Averge length of freeze-thaw spells.", units="days", - long_name="{freq} average length of freeze-thaw spells.", - description="{freq} average length of freeze-thaw spells" - ": Tmax {op_tasmax} {thresh_tasmax} and Tmin {op_tasmin} {thresh_tasmin} " - "for at least {window} consecutive day(s).", + long_name="Average length of events where maximum daily temperatures are above {thresh_tasmax} " + "and minimum daily temperatures are at or below {thresh_tasmin} for at least {window} consecutive day(s).", + description="{freq} average length of freeze-thaw spells, where maximum daily temperatures are above " + "{thresh_tasmax} and minimum daily temperatures are at or below {thresh_tasmin} for at least {window} consecutive " + "day(s).", + abstract="Average length of daily freeze-thaw spells. A freeze-thaw spell is defined as a number of consecutive " + "days where maximum daily temperatures are above a given threshold and minimum daily temperatures are at or below " + "a given threshold, usually 0°C for both.", cell_methods="", compute=indices.multiday_temperature_swing, parameters={ @@ -508,132 +579,171 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): freezethaw_spell_max_length = Temp( + title="Maximal length of freeze-thaw spells", identifier="freezethaw_spell_max_length", - title="Maximal length of freeze-thaw spells.", units="days", - long_name="{freq} maximal length of freeze-thaw spells.", - description="{freq} maximal length of freeze-thaw spells" - ": Tmax {op_tasmax} {thresh_tasmax} and Tmin {op_tasmin} {thresh_tasmin} " - "for at least {window} consecutive day(s).", + long_name="Maximal length of events where maximum daily temperatures are above {thresh_tasmax} " + "and minimum daily temperatures are at or below {thresh_tasmin} for at least {window} consecutive day(s).", + description="{freq} maximal length of freeze-thaw spells, where maximum daily temperatures are above " + "{thresh_tasmax} and minimum daily temperatures are at or below {thresh_tasmin} for at least {window} consecutive " + "day(s).", + abstract="Maximal length of daily freeze-thaw spells. A freeze-thaw spell is defined as a number of consecutive " + "days where maximum daily temperatures are above a given threshold and minimum daily temperatures are at or below " + "a threshold, usually 0°C for both.", cell_methods="", compute=indices.multiday_temperature_swing, parameters={ "op": "max", "thresh_tasmax": {"default": "0 degC"}, "thresh_tasmin": {"default": "0 degC"}, - "op_tasmax": ">", - "op_tasmin": "<=", + "op_tasmax": {"default": ">"}, + "op_tasmin": {"default": "<="}, }, ) cooling_degree_days = TempWithIndexing( + title="Cooling degree days", identifier="cooling_degree_days", units="K days", standard_name="integral_of_air_temperature_excess_wrt_time", - long_name="Cooling degree days (Tmean > {thresh})", - description="{freq} cooling degree days above {thresh}.", + long_name="Cumulative sum of temperature degrees for mean daily temperature above {thresh}", + description="{freq} cumulative cooling degree days (mean temperature above {thresh}).", + abstract="The cumulative degree days for days when the mean daily temperature is above a given threshold and " + "buildings must be air conditioned.", cell_methods="time: sum over days", compute=indices.cooling_degree_days, parameters={"thresh": {"default": "18.0 degC"}}, ) heating_degree_days = TempWithIndexing( + title="Heating degree days", identifier="heating_degree_days", units="K days", standard_name="integral_of_air_temperature_deficit_wrt_time", - long_name="Heating degree days (Tmean < {thresh})", - description="{freq} heating degree days below {thresh}.", + long_name="Cumulative sum of temperature degrees for mean daily temperature below {thresh}", + description="{freq} cumulative heating degree days (mean temperature below {thresh}).", + abstract="The cumulative degree days for days when the mean daily temperature is below a given threshold and " + "buildings must be heated.", cell_methods="time: sum over days", compute=indices.heating_degree_days, parameters={"thresh": {"default": "17.0 degC"}}, ) growing_degree_days = TempWithIndexing( + title="Growing degree days", identifier="growing_degree_days", units="K days", standard_name="integral_of_air_temperature_excess_wrt_time", - long_name="Growing degree days above {thresh}", - description="{freq} growing degree days above {thresh}.", + long_name="Cumulative sum of temperature degrees for mean daily temperature above {thresh}", + description="{freq} growing degree days (mean temperature above {thresh}).", + abstract="The cumulative degree days for days when the average temperature is above a given threshold.", cell_methods="time: sum over days", compute=indices.growing_degree_days, parameters={"thresh": {"default": "4.0 degC"}}, ) freezing_degree_days = TempWithIndexing( + title="Freezing degree days", identifier="freezing_degree_days", units="K days", standard_name="integral_of_air_temperature_deficit_wrt_time", - long_name="Freezing degree days (Tmean < {thresh})", - description="{freq} freezing degree days below {thresh}.", + long_name="Cumulative sum of temperature degrees for mean daily temperature below {thresh}", + description="{freq} freezing degree days (mean temperature below {thresh}).", + abstract="The cumulative degree days for days when the average temperature is below a given threshold, " + "typically 0°C.", cell_methods="time: sum over days", compute=indices.heating_degree_days, parameters={"thresh": {"default": "0 degC"}}, ) thawing_degree_days = TempWithIndexing( + title="Thawing degree days", identifier="thawing_degree_days", units="K days", standard_name="integral_of_air_temperature_excess_wrt_time", - long_name="Thawing degree days (degree days above 0°C)", - description="{freq} thawing degree days above 0°C.", + long_name="Cumulative sum of temperature degrees for mean daily temperature above {thresh}", + description="{freq} thawing degree days (mean temperature above {thresh}).", + abstract="The cumulative degree days for days when the average temperature is above a given threshold, " + "typically 0°C.", cell_methods="time: sum over days", compute=indices.growing_degree_days, parameters={"thresh": {"default": "0 degC"}}, ) freshet_start = Temp( + title="Day of year of spring freshet start", identifier="freshet_start", units="", standard_name="day_of_year", - long_name="Day of year of spring freshet start", - description="Day of year of spring freshet start, defined as the first day a temperature " - "threshold of {thresh} is exceeded for at least {window} days.", - compute=indices.freshet_start, + long_name="First day where temperature threshold of {thresh} is exceeded for at least {window} days", + description="Day of year of the spring freshet start, defined as the first day a temperature threshold of {thresh} " + "is exceeded for at least {window} days.", + abstract="Day of year of the spring freshet start, defined as the first day when the temperature exceeds a certain " + "threshold for a given number of consecutive days.", + compute=indices.first_day_temperature_above, + parameters={"thresh": {"default": "0 degC"}, "window": {"default": 5}}, ) frost_days = TempWithIndexing( + title="Frost days", identifier="frost_days", units="days", standard_name="days_with_air_temperature_below_threshold", - long_name="Number of frost days (Tmin < {thresh})", - description="{freq} number of days with minimum daily temperature below {thresh}.", + long_name="Number of days where the daily minimum temperature is below {thresh}", + description="{freq} number of days where the daily minimum temperature is below {thresh}.", + abstract="Number of days where the daily minimum temperature is below a given threshold.", cell_methods="time: sum over days", compute=indices.frost_days, ) frost_season_length = Temp( + title="Frost season length", identifier="frost_season_length", units="days", standard_name="days_with_air_temperature_below_threshold", - long_name="Length of the frost season", - description="{freq} number of days between the first occurrence of at least " - "{window} consecutive days with minimum daily temperature below freezing and " - "the first occurrence of at least {window} consecutive days with " - "minimum daily temperature above freezing after {mid_date}.", + long_name="Number of days between the first occurrence of at least {window} consecutive days with " + "minimum daily temperature below {thresh} and the first occurrence of at least {window} consecutive days with " + "minimum daily temperature at or above {thresh} after {mid_date}", + description="{freq} number of days between the first occurrence of at least {window} consecutive days with " + "minimum daily temperature below {thresh} and the first occurrence of at least {window} consecutive days with " + "minimum daily temperature at or above {thresh} after {mid_date}.", + abstract="Duration of the freezing season, defined as the period when the daily minimum temperature is below 0°C " + "without a thawing window of days, with the thaw occurring after a median calendar date.", cell_methods="time: sum over days", compute=indices.frost_season_length, - parameters=dict(thresh="0 degC"), + parameters={"thresh": {"default": "0 degC"}}, ) last_spring_frost = Temp( + title="Last spring frost", identifier="last_spring_frost", units="", standard_name="day_of_year", - long_name="Day of year of last spring frost", + long_name="Last day of minimum daily temperature below a threshold of {thresh} " + "for at least {window} days before a given date ({before_date})", description="Day of year of last spring frost, defined as the last day a minimum temperature " - "threshold of {thresh} is not exceeded before a given date.", + "remains below a threshold of {thresh} for at least {window} days before a given date ({before_date}).", + abstract="The last day when temperature is below a given threshold for a certain number of days, " + "limited by a final calendar date.", + cell_methods="", compute=indices.last_spring_frost, + parameters={"before_date": {"default": "07-01"}}, ) first_day_below = Temp( + title="First day below", identifier="first_day_below", units="", standard_name="day_of_year", - long_name="First day of year with temperature below {thresh}", - description="First day of year with temperature below {thresh} for at least {window} days.", + long_name="First day of year with temperature below threshold", + description="First day of year with temperature below {thresh} for at least {window} days after {after_date}.", + abstract="Calculates the first day of a period when the temperature is lower than a certain threshold during a " + "given number of days, after a given calendar date.", + cell_methods="", compute=indices.first_day_temperature_below, input=dict(tas="tasmin"), + parameters={"after_date": {"default": "07-01"}}, _version_deprecated="0.39.0", ) @@ -641,7 +751,7 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): identifier="first_day_tn_below", units="", standard_name="day_of_year", - long_name="First day of year with minimum temperature below {thresh}", + long_name="First day of year with a period of at least {window} days of minimum temperature below {thresh}", description="First day of year with minimum temperature below {thresh} for at least {window} days.", compute=indices.first_day_temperature_below, input=dict(tas="tasmin"), @@ -656,7 +766,7 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): identifier="first_day_tg_below", units="", standard_name="day_of_year", - long_name="First day of year with mean temperature below {thresh}", + long_name="First day of year with a period of at least {window} days of mean temperature below {thresh}", description="First day of year with mean temperature below {thresh} for at least {window} days.", compute=indices.first_day_temperature_below, parameters=dict( @@ -670,7 +780,7 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): identifier="first_day_tx_below", units="", standard_name="day_of_year", - long_name="First day of year with maximum temperature below {thresh}", + long_name="First day of year with a period of at least {window} days of maximum temperature below {thresh}", description="First day of year with maximum temperature below {thresh} for at least {window} days.", compute=indices.first_day_temperature_below, input=dict(tas="tasmax"), @@ -682,13 +792,18 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): ) first_day_above = Temp( + title="First day above", identifier="first_day_above", units="", standard_name="day_of_year", - long_name="First day of year with temperature above {thresh}", - description="First day of year with temperature above {thresh} for at least {window} days.", + long_name="First day of year with temperature above threshold", + description="First day of year with temperature above {thresh} for at least {window} days after {after_date}.", + abstract="Calculates the first day of a period when the temperature is higher than a certain threshold during a " + "given number of days, after a given calendar date.", + cell_methods="", compute=indices.first_day_temperature_above, input=dict(tas="tasmin"), + parameters={"after_date": {"default": "07-01"}}, _version_deprecated="0.39.0", ) @@ -696,7 +811,7 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): identifier="first_day_tn_above", units="", standard_name="day_of_year", - long_name="First day of year with minimum temperature above {thresh}", + long_name="First day of year with a period of at least {window} days of minimum temperature above {thresh}", description="First day of year with minimum temperature above {thresh} for at least {window} days.", compute=indices.first_day_temperature_above, input=dict(tas="tasmin"), @@ -712,7 +827,7 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): identifier="first_day_tg_above", units="", standard_name="day_of_year", - long_name="First day of year with mean temperature above {thresh}", + long_name="First day of year with a period of at least {window} days of mean temperature above {thresh}", description="First day of year with mean temperature above {thresh} for at least {window} days.", compute=indices.first_day_temperature_above, parameters=dict( @@ -726,7 +841,7 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): identifier="first_day_tx_above", units="", standard_name="day_of_year", - long_name="First day of year with maximum temperature above {thresh}", + long_name="First day of year with a period of at least {window} days of maximum temperature above {thresh}", description="First day of year with maximum temperature above {thresh} for at least {window} days.", compute=indices.first_day_temperature_above, input=dict(tas="tasmax"), @@ -738,230 +853,286 @@ class TempWithIndexing(ResamplingIndicatorWithIndexing): ) ice_days = TempWithIndexing( + title="Ice days", identifier="ice_days", standard_name="days_with_air_temperature_below_threshold", units="days", - long_name="Number of ice days (Tmax < {thresh})", - description="{freq} number of days with maximum daily temperature below {thresh}.", + long_name="Number of days with maximum daily temperature below {thresh}", + description="{freq} number of days where the maximum daily temperature is below {thresh}.", + abstract="Number of days where the daily maximum temperature is below 0°C", cell_methods="time: sum over days", compute=indices.ice_days, ) consecutive_frost_days = Temp( + title="Consecutive frost days", identifier="consecutive_frost_days", units="days", standard_name="spell_length_of_days_with_air_temperature_below_threshold", - long_name="Maximum number of consecutive days with Tmin < {thresh}", - description="{freq} maximum number of consecutive days with " - "minimum daily temperature below {thresh}.", + long_name="Maximum number of consecutive days where minimum daily temperature is below {thresh}", + description="{freq} maximum number of consecutive days where minimum daily temperature is below {thresh}.", + abstract="Maximum number of consecutive days where the daily minimum temperature is below 0°C", cell_methods="time: maximum over days", compute=indices.maximum_consecutive_frost_days, + parameters={"thresh": {"default": "0 degC"}}, ) frost_free_season_length = Temp( + title="Frost free season length", identifier="frost_free_season_length", units="days", standard_name="days_with_air_temperature_above_threshold", - long_name="Length of the frost free season", - description="{freq} number of days between the first occurrence of at least " - "{window} consecutive days with minimum daily temperature above or at the freezing point and " - "the first occurrence of at least {window} consecutive days with " - "minimum daily temperature below freezing after {mid_date}.", + long_name="Number of days between the first occurrence of at least {window} consecutive days " + "with minimum daily temperature at or above {thresh} and the first occurrence of at least " + "{window} consecutive days with minimum daily temperature below {thresh} after {mid_date}", + description="{freq} number of days between the first occurrence of at least {window} consecutive days " + "with minimum daily temperature at or above {thresh} and the first occurrence of at least " + "{window} consecutive days with minimum daily temperature below {thresh} after {mid_date}.", + abstract="Duration of the frost free season, defined as the period when the minimum daily temperature is above 0°C " + "without a freezing window of `N` days, with freezing occurring after a median calendar date.", cell_methods="time: sum over days", compute=indices.frost_free_season_length, parameters={"thresh": {"default": "0 degC"}}, ) frost_free_season_start = Temp( + title="Frost free season start", identifier="frost_free_season_start", units="", standard_name="day_of_year", - long_name="Day of year of frost free season start", - description="Day of year of beginning of frost free season, defined as the first day a minimum temperature " - "threshold of {thresh} is equal or exceeded for at least {window} days.", + long_name="First day following a period of {window} days with minimum daily temperature at or above {thresh}", + description="Day of the year of the beginning of the frost-free season, defined as the {window}th consecutive day " + "when minimum daily temperature exceeds {thresh}.", + abstract="First day when minimum daily temperature exceeds a given threshold for a given number of consecutive days", compute=indices.frost_free_season_start, parameters={"thresh": {"default": "0 degC"}}, ) frost_free_season_end = Temp( + title="Frost free season end", identifier="frost_free_season_end", units="", standard_name="day_of_year", - long_name="Day of year of frost free season end", - description="Day of year of end of frost free season, defined as the first day minimum temperatures below a " - "threshold of {thresh}, after a run of days above this threshold, for at least {window} days.", + long_name="First day, after {mid_date}, following a period of {window} days " + "with minimum daily temperature below {thresh}", + description="Day of the year of the end of the frost-free season, defined as the interval between the first set of " + "{window} days when the minimum daily temperature is at or above {thresh} " + "and the first set (after {mid_date}) of {window} days when it is below {thresh}.", + abstract="First day when the temperature is below a given threshold for a given number of consecutive days after " + "a median calendar date.", cell_methods="", compute=indices.frost_free_season_end, parameters={"thresh": {"default": "0 degC"}}, ) maximum_consecutive_frost_free_days = Temp( + title="Maximum consecutive frost free days", + # FIXME: shouldn't this be `maximum_`? Breaking changes needed. identifier="consecutive_frost_free_days", units="days", standard_name="spell_length_of_days_with_air_temperature_above_threshold", - long_name="Maximum number of consecutive days with Tmin >= {thresh}", - description="{freq} maximum number of consecutive days with " - "minimum daily temperature above or equal to {thresh}.", + long_name="Maximum number of consecutive days with minimum temperature at or above {thresh}", + description="{freq} maximum number of consecutive days with minimum daily temperature at or above {thresh}.", + abstract="Maximum number of consecutive frost-free days: where the daily minimum temperature is above " + "or equal to 0°C", cell_methods="time: maximum over days", compute=indices.maximum_consecutive_frost_free_days, + parameters={"thresh": {"default": "0 degC"}}, ) growing_season_start = Temp( + title="Growing season start", identifier="growing_season_start", units="", standard_name="day_of_year", - long_name="Day of year of growing season start", - description="Day of year of start of growing season, defined as the first day of " - "consistent superior or equal to threshold temperature of {thresh} after a run of " - "{window} days inferior to threshold temperature.", + long_name="First day of the first series of {window} days with mean daily temperature above or equal to {thresh}", + description="Day of the year marking the beginning of the growing season, defined as the first day of the first " + "series of {window} days with mean daily temperature above or equal to {thresh}.", + abstract="The first day when the temperature exceeds a certain threshold for a given number of consecutive days.", cell_methods="", compute=indices.growing_season_start, parameters={"thresh": {"default": "5.0 degC"}}, ) growing_season_length = Temp( + title="Growing season length", identifier="growing_season_length", units="days", standard_name="growing_season_length", - long_name="ETCCDI Growing Season Length (Tmean > {thresh})", - description="{freq} number of days between the first occurrence of at least " - "{window} consecutive days with mean daily temperature over {thresh} and " - "the first occurrence of at least {window} consecutive days with " - "mean daily temperature below {thresh} after {mid_date}.", + long_name="Number of days between the first occurrence of at least {window} consecutive days with mean " + "daily temperature over {thresh} and the first occurrence of at least {window} consecutive days with " + "mean daily temperature below {thresh}, occurring after {mid_date}", + description="{freq} number of days between the first occurrence of at least {window} consecutive days " + "with mean daily temperature over {thresh} and the first occurrence of at least {window} consecutive days with " + "mean daily temperature below {thresh}, occurring after {mid_date}.", + abstract="Number of days between the first occurrence of a series of days with a daily average temperature above a " + "threshold and the first occurrence of a series of days with a daily average temperature below that same " + "threshold, occurring after a given calendar date.", cell_methods="", compute=indices.growing_season_length, - parameters={"thresh": {"default": "5.0 degC"}}, + parameters={"thresh": {"default": "5.0 degC"}, "mid_date": {"default": "07-01"}}, ) growing_season_end = Temp( + title="Growing season end", identifier="growing_season_end", units="", standard_name="day_of_year", - long_name="Day of year of growing season end", - description="Day of year of end of growing season, defined as the first day of " - "consistent inferior threshold temperature of {thresh} after a run of " - "{window} days superior to threshold temperature.", + long_name="First day of the first series of {window} days with mean daily temperature below {thresh}, " + "occurring after {mid_date}", + description="Day of year of end of growing season, defined as the first day of consistent inferior threshold " + "temperature of {thresh} after a run of {window} days superior to threshold temperature, occurring after " + "{mid_date}.", + abstract="The first day when the temperature is below a certain threshold for a certain number of consecutive days " + "after a given calendar date.", cell_methods="", compute=indices.growing_season_end, - parameters={"thresh": {"default": "5.0 degC"}}, + parameters={"thresh": {"default": "5.0 degC"}, "mid_date": {"default": "07-01"}}, ) tropical_nights = TempWithIndexing( + title="Tropical nights", identifier="tropical_nights", units="days", standard_name="number_of_days_with_air_temperature_above_threshold", - long_name="Number of Tropical Nights (Tmin > {thresh})", - description="{freq} number of Tropical Nights : defined as days with minimum daily temperature" - " above {thresh}.", + long_name="Number of days with minimum daily temperature above {thresh}", + description="{freq} number of Tropical Nights, defined as days with minimum daily temperature above {thresh}.", + abstract="Number of days where minimum temperature is above a given threshold.", cell_methods="time: sum over days", compute=indices.tn_days_above, parameters={"thresh": {"default": "20.0 degC"}}, ) tg90p = TempWithIndexing( + title="Days with mean temperature above the 90th percentile", identifier="tg90p", units="days", standard_name="days_with_air_temperature_above_threshold", - long_name="Number of days when Tmean > {tas_per_thresh}th percentile", - description="{freq} number of days with mean daily temperature above the the {tas_per_thresh}th " - "percentile(s). A {tas_per_window} day(s) window, centred on each calendar day in the " - "{tas_per_period} period, is used to compute the {tas_per_thresh}th percentile(s).", + long_name="Number of days with mean temperature above the 90th percentile", + description="{freq} number of days with mean temperature above the 90th percentile. " + "A {tas_per_window} day(s) window, centered on each calendar day in the {tas_per_period} period, " + "is used to compute the 90th percentile.", + abstract="Number of days with mean temperature above the 90th percentile.", cell_methods="time: sum over days", compute=indices.tg90p, ) tg10p = TempWithIndexing( + title="Days with mean temperature below the 10th percentile", identifier="tg10p", units="days", standard_name="days_with_air_temperature_below_threshold", - long_name="Number of days when Tmean < {tas_per_thresh}th percentile", - description="{freq} number of days with mean daily temperature below the {tas_per_thresh}th " - "percentile(s). A {tas_per_window} day(s) window, centred on each calendar day in the " - "{tas_per_period} period, is used to compute the {tas_per_thresh}th percentile(s).", + long_name="Number of days with mean temperature below the 10th percentile", + description="{freq} number of days with mean temperature below the 10th percentile. " + "A {tas_per_window} day(s) window, centered on each calendar day in the {tas_per_period} period, " + "is used to compute the 10th percentile.", + abstract="Number of days with mean temperature below the 10th percentile.", cell_methods="time: sum over days", compute=indices.tg10p, ) tx90p = TempWithIndexing( + title="Days with maximum temperature above the 90th percentile", identifier="tx90p", units="days", standard_name="days_with_air_temperature_above_threshold", - long_name="Number of days when Tmax > {tasmax_per_thresh}th percentile", - description="{freq} number of days with maximum daily temperature above the {tasmax_per_thresh}th " - "percentile(s). A {tasmax_per_window} day(s) window, centred on each calendar day in the " - "{tasmax_per_period} period, is used to compute the {tasmax_per_thresh}th percentile(s).", + long_name="Number of days with maximum temperature above the 90th percentile", + description="{freq} number of days with maximum temperature above the 90th percentile. " + "A {tasmax_per_window} day(s) window, centered on each calendar day in the {tasmax_per_period} period, " + "is used to compute the 90th percentile.", + abstract="Number of days with maximum temperature above the 90th percentile.", cell_methods="time: sum over days", compute=indices.tx90p, ) tx10p = TempWithIndexing( + title="Days with maximum temperature below the 10th percentile", identifier="tx10p", units="days", standard_name="days_with_air_temperature_below_threshold", - long_name="Number of days when Tmax < {tasmax_per_thresh}th percentile", - description="{freq} number of days with maximum daily temperature below the {tasmax_per_thresh}th " - "percentile(s). A {tasmax_per_window} day(s) window, centred on each calendar day in the " - "{tasmax_per_period} period, is used to compute the {tasmax_per_thresh}th percentile(s).", + long_name="Number of days with maximum temperature below the 10th percentile", + description="{freq} number of days with maximum temperature below the 10th percentile. " + "A {tasmax_per_window} day(s) window, centered on each calendar day in the {tasmax_per_period} period, " + "is used to compute the 10th percentile.", + abstract="Number of days with maximum temperature below the 10th percentile.", cell_methods="time: sum over days", compute=indices.tx10p, ) tn90p = TempWithIndexing( + title="Days with minimum temperature above the 90th percentile", identifier="tn90p", units="days", standard_name="days_with_air_temperature_above_threshold", - long_name="Number of days when Tmin > {tasmin_per_thresh}th percentile", - description="{freq} number of days with minimum daily temperature above the the {tasmin_per_thresh}th " - "percentile(s). A {tasmin_per_window} day(s) window, centred on each calendar day in the " - "{tasmin_per_period} period, is used to compute the {tasmin_per_thresh}th percentile(s).", + long_name="Number of days with minimum temperature above the 90th percentile", + description="{freq} number of days with minimum temperature above the 90th percentile. " + "A {tasmin_per_window} day(s) window, centered on each calendar day in the {tasmin_per_period} period, " + "is used to compute the 90th percentile.", + abstract="Number of days with minimum temperature above the 90th percentile.", cell_methods="time: sum over days", compute=indices.tn90p, ) tn10p = TempWithIndexing( + title="Days with minimum temperature below the 10th percentile", identifier="tn10p", units="days", standard_name="days_with_air_temperature_below_threshold", - long_name="Number of days when Tmin < {tasmin_per_thresh}th percentile", - description="{freq} number of days with minimum daily temperature below the the {tasmin_per_thresh}th " - "percentile(s). A {tasmin_per_window} day(s) window, centred on each calendar day in the " - "{tasmin_per_period} period, is used to compute the {tasmin_per_thresh}th percentile(s).", + long_name="Number of days with minimum temperature below the 10th percentile", + description="{freq} number of days with minimum temperature below the 10th percentile. " + "A {tasmin_per_window} day(s) window, centered on each calendar day in the {tasmin_per_period} period, " + "is used to compute the 10th percentile.", + abstract="Number of days with minimum temperature below the 10th percentile.", cell_methods="time: sum over days", compute=indices.tn10p, ) degree_days_exceedance_date = Temp( + title="Degree day exceedance date", identifier="degree_days_exceedance_date", units="", standard_name="day_of_year", - long_name="Day of year when cumulative degree days exceed {sum_thresh}.", - description="Day of year when the integral of degree days (tmean {op} {thresh})" - " exceeds {sum_thresh}, the cumulative sum starts on {after_date}.", + long_name="Day of year when the integral of mean daily temperature {op} {thresh} exceeds {sum_thresh}", + description=lambda **kws: "Day of year when the integral of degree days (mean daily temperature {op} {thresh}) " + "exceeds {sum_thresh}" + + ( + ", with the cumulative sum starting from {after_date}." + if kws["after_date"] is not None + else "." + ), + abstract="The day of the year when the sum of degree days exceeds a threshold, occurring after a given date. " + "Degree days are calculated above or below a given temperature threshold.", cell_methods="", compute=indices.degree_days_exceedance_date, ) warm_spell_duration_index = Temp( + title="Warm spell duration index", identifier="warm_spell_duration_index", - long_name="Number of days part of a percentile-defined warm spell", - description="{freq} number of days with at least {window} consecutive days " - "where the daily maximum temperature is above the {tasmax_per_thresh}th " - "percentile(s). A {tasmax_per_window} day(s) window, centred on each calendar day in the " - "{tasmax_per_period} period, is used to compute the {tasmax_per_thresh}th percentile(s).", units="days", standard_name="number_of_days_with_air_temperature_above_threshold", + long_name="Number of days with at least {window} consecutive days where the maximum daily temperature is above " + "the {tasmax_per_thresh}th percentile(s)", + description="{freq} number of days with at least {window} consecutive days where the maximum daily temperature is " + "above the {tasmax_per_thresh}th percentile(s). A {tasmax_per_window} day(s) window, centred on each calendar day " + "in the {tasmax_per_period} period, is used to compute the {tasmax_per_thresh}th percentile(s).", + abstract="Number of days part of a percentile-defined warm spell. A warm spell occurs when the maximum daily " + "temperature is above a given percentile for a given number of consecutive days.", cell_methods="time: sum over days", compute=indices.warm_spell_duration_index, ) maximum_consecutive_warm_days = Temp( + title="Maximum consecutive warm days", identifier="maximum_consecutive_warm_days", - description="{freq} longest spell of consecutive days with Tmax above {thresh}.", units="days", standard_name="spell_length_of_days_with_air_temperature_above_threshold", + long_name="Maximum number of consecutive days with maximum daily temperature above {thresh}", + description="{freq} longest spell of consecutive days with maximum daily temperature above {thresh}.", + abstract="Maximum number of consecutive days where the maximum daily temperature exceeds a certain threshold.", cell_methods="time: maximum over days", compute=indices.maximum_consecutive_tx_days, ) @@ -984,66 +1155,102 @@ def cfcheck(self, tas, snd=None): huglin_index = Temp( + title="Huglin heliothermal index", identifier="huglin_index", units="", - long_name="Huglin heliothermal index (Summation of ((Tmin + Tmax)/2 - {thresh}) * Latitude-based day-length" - "coefficient (`k`), for days between {start_date} and {end_date}).", - description="Heat-summation index for agroclimatic suitability estimation, developed specifically for viticulture. " - "Considers daily Tmin and Tmax with a base of {thresh}, typically between 1 April and 30 September. " - "Integrates a day-length coefficient calculation for higher latitudes. " + long_name="Integral of mean daily temperature above {thresh} multiplied by day-length coefficient with {method} " + "method for days between {start_date} and {end_date}", + description="Heat-summation index for agroclimatic suitability estimation, developed specifically for viticulture, " + "computed with {method} formula (Summation of ((Tn + Tx)/2 - {thresh}) * k), where coefficient `k` is a " + "latitude-based day-length for days between {start_date} and {end_date}.", + abstract="Heat-summation index for agroclimatic suitability estimation, developed specifically for viticulture. " + "Considers daily minimum and maximum temperature with a given base threshold, typically between 1 April and 30" + "September, and integrates a day-length coefficient calculation for higher latitudes. " "Metric originally published in Huglin (1978). Day-length coefficient based on Hall & Jones (2010).", cell_methods="", var_name="hi", compute=indices.huglin_index, - parameters=dict(method="jones"), + parameters={ + "lat": {"kind": InputKind.VARIABLE}, + "method": {"default": "jones"}, + "start_date": {"default": "04-01"}, + "end_date": {"default": "10-01"}, + }, ) biologically_effective_degree_days = Temp( + title="Biologically effective degree days", identifier="biologically_effective_degree_days", units="K days", - long_name="Biologically effective degree days computed with {method} formula (Summation of min((max((Tmin + Tmax)/2" - " - {thresh_tasmin}, 0) * k) + TR_adg, 9°C), for days between {start_date} and {end_date}).", + long_name="Integral of mean daily temperature above {thresh_tasmin}, with maximum value of " + "{max_daily_degree_days}, multiplied by day-length coefficient and temperature range modifier based on {method} " + "method for days between {start_date} and {end_date}", description="Heat-summation index for agroclimatic suitability estimation, developed specifically for viticulture. " - "Considers daily Tmin and Tmax with a base of {thresh_tasmin} between 1 April and 31 October, with a maximum daily " - "value for degree days (typically 9°C). It also integrates a modification coefficient for latitudes " - "between 40°N and 50°N as well as swings in daily temperature range. " - "Original formula published in Gladstones, 1992.", + "Computed with {method} formula (Summation of min((max((Tn + Tx)/2 - {thresh_tasmin}, 0) * k) + TR_adj, Dmax), " + "where coefficient `k` is a latitude-based day-length for days between {start_date} and {end_date}), " + "coefficient `TR_adj` is a modifier accounting for large temperature swings, and `Dmax` is the maximum possible" + "amount of degree days that can be gained within a day ({max_daily_degree_days}).", + abstract="Considers daily minimum and maximum temperature with a given base threshold between 1 April and 31 " + "October, with a maximum daily value for cumulative degree days (typically 9°C), and integrates modification " + "coefficients for latitudes between 40°N and 50°N as well as for swings in daily temperature range. " + "Metric originally published in Gladstones (1992).", cell_methods="", var_name="bedd", compute=indices.biologically_effective_degree_days, - parameters={"method": "gladstones", "lat": {"kind": InputKind.VARIABLE}}, + parameters={ + "lat": {"kind": InputKind.VARIABLE}, + "method": {"default": "gladstones"}, + "start_date": {"default": "04-01"}, + "end_date": {"default": "11-01"}, + }, ) effective_growing_degree_days = Temp( + title="Effective growing degree days", identifier="effective_growing_degree_days", units="K days", - long_name="Effective growing degree days computed with {method} formula (Summation of max((Tmin + Tmax)/2 " - "- {thresh}, 0), for days between between dynamically-determined start and end dates).", + long_name="Integral of mean daily temperature above {thresh} for days between start and end dates " + "dynamically determined using {method} method", description="Heat-summation index for agroclimatic suitability estimation." - "Considers daily Tmin and Tmax with a base of {thresh} between dynamically-determined growing season start" - "and end dates. The 'bootsma' method uses a 10-day average temperature above {thresh} to identify a start date, " - "while the 'qian' method uses a weighted mean average above {thresh} over 5 days to determine start date. " - "The end date of the growing season is the date of first fall frost (Tmin < 0°C). " - "Original formula published in Bootsma et al. 2005.", + "Computed with {method} formula (Summation of max((Tn + Tx)/2 - {thresh}, 0) between dynamically-determined " + "growing season start and end dates. The `bootsma` method uses a 10-day average temperature above {thresh} to " + "identify a start date, while the `qian` method uses a weighted mean average above {thresh} over 5 days to " + "determine the start date. The end date of the growing season is the date of first fall frost (Tn < 0°C) occurring" + "after {after_date}.", + abstract="Considers daily minimum and maximum temperature with a given base threshold between " + "dynamically-determined growing season start and end dates. The `bootsma` method uses a 10-day mean temperature " + "above a given threshold to identify a start date, while the `qian` method uses a weighted mean temperature above " + "a given threshold over 5 days to determine the start date. The end date of the growing season is the date of " + "first fall frost (Tn < 0°C) occurring after a given date (typically, July 1). " + "Metric originally published in Bootsma et al. (2005).", cell_methods="", var_name="egdd", compute=indices.effective_growing_degree_days, + parameters={ + "method": {"default": "bootsma"}, + "thresh": {"default": "5 degC"}, + "after_date": {"default": "07-01"}, + }, ) latitude_temperature_index = Temp( + title="Latitude temperature index", identifier="latitude_temperature_index", units="", - long_name="Latitude-temperature index", + long_name="Mean temperature of warmest month multiplied by the difference of {lat_factor} minus latitude", description="A climate indice based on mean temperature of the warmest month and a latitude-based coefficient to " "account for longer day-length favouring growing conditions. Developed specifically for viticulture. " - "Mean temperature of warmest month * ({lat_factor} - latitude). " - "Indice originally published in Jackson, D. I., & Cherry, N. J. (1988)", + "Mean temperature of warmest month multiplied by the difference of {lat_factor} minus latitude.", + abstract="A climate indice based on mean temperature of the warmest month and a latitude-based coefficient to " + "account for longer day-length favouring growing conditions. Developed specifically for viticulture. " + "Mean temperature of warmest month multiplied by the difference of latitude factor coefficient minus latitude. " + "Metric originally published in Jackson, D. I., & Cherry, N. J. (1988).", cell_methods="", allowed_periods=["A"], var_name="lti", compute=indices.latitude_temperature_index, - parameters={"lat_factor": 60, "lat": {"kind": InputKind.VARIABLE}}, + parameters={"lat": {"kind": InputKind.VARIABLE}, "lat_factor": 60}, ) diff --git a/xclim/indicators/atmos/_wind.py b/xclim/indicators/atmos/_wind.py index abf2bd783..3d37dab7c 100644 --- a/xclim/indicators/atmos/_wind.py +++ b/xclim/indicators/atmos/_wind.py @@ -13,21 +13,25 @@ class Wind(ResamplingIndicatorWithIndexing): calm_days = Wind( + title="Calm days", identifier="calm_days", units="days", standard_name="number_of_days_with_sfcWind_below_threshold", - long_name="Number of days with surface wind speed below threshold", - description="{freq} number of days with surface wind speed < {thresh}", + long_name="Number of days with surface wind speed below {thresh}", + description="{freq} number of days with surface wind speed below {thresh}.", + abstract="Number of days with surface wind speed below threshold.", cell_methods="time: sum over days", compute=indices.calm_days, ) windy_days = Wind( + title="Windy days", identifier="windy_days", units="days", standard_name="number_of_days_with_sfcWind_above_threshold", - long_name="Number of days with surface wind speed above threshold", - description="{freq} number of days with surface wind speed >= {thresh}", + long_name="Number of days with surface wind speed at or above {thresh}", + description="{freq} number of days with surface wind speed at or above {thresh}.", + abstract="Number of days with surface wind speed at or above threshold.", cell_methods="time: sum over days", compute=indices.windy_days, ) diff --git a/xclim/indicators/land/_snow.py b/xclim/indicators/land/_snow.py index f6f9a6fe3..07c807690 100644 --- a/xclim/indicators/land/_snow.py +++ b/xclim/indicators/land/_snow.py @@ -29,104 +29,130 @@ class SnowWithIndexing(ResamplingIndicatorWithIndexing): snow_cover_duration = SnowWithIndexing( + title="Snow cover duration", identifier="snow_cover_duration", units="days", - long_name="Number of days with snow depth above threshold", - description="{freq} number of days with snow depth greater or equal to {thresh}", + long_name="Number of days with snow depth at or above threshold", + description="The {freq} number of days with snow depth greater than or equal to {thresh}.", + abstract="Number of days when the snow depth is greater than or equal to a given threshold.", compute=xci.snow_cover_duration, ) continuous_snow_cover_start = Snow( + title="Start date of continuous snow cover", identifier="continuous_snow_cover_start", standard_name="day_of_year", long_name="Start date of continuous snow cover", description="Day of year when snow depth is above or equal to {thresh} for {window} consecutive days.", + abstract="The first date on which snow depth is greater than or equal to a given threshold " + "for a given number of consecutive days.", units="", compute=xci.continuous_snow_cover_start, ) continuous_snow_cover_end = Snow( + title="End date of continuous snow cover", identifier="continuous_snow_cover_end", standard_name="day_of_year", long_name="End date of continuous snow cover", description="Day of year when snow depth is below {thresh} for {window} consecutive days.", + abstract="The first date on which snow depth is below a given threshold for a given number of consecutive days.", units="", compute=xci.continuous_snow_cover_end, ) snd_max_doy = SnowWithIndexing( + title="Day of year of maximum snow depth", identifier="snd_max_doy", standard_name="day_of_year", var_name="{freq}_snd_max_doy", - long_name="Date when snow depth reaches its maximum value.", - description="{freq} day of year when snow depth reaches its maximum value.", + long_name="Day of the year when snow depth reaches its maximum value", + description="The {freq} day of the year when snow depth reaches its maximum value.", + abstract="Day of the year when snow depth reaches its maximum value.", units="", _partial=True, compute=xci.snd_max_doy, ) snow_melt_we_max = Snow( + title="Maximum snow melt", identifier="snow_melt_we_max", standard_name="change_over_time_in_surface_snow_amount", var_name="{freq}_snow_melt_we_max", - description="{freq} maximum negative change in melt amount over {window} days.", + long_name="Maximum snow melt", + description="The {freq} maximum negative change in melt amount over {window} days.", + abstract="The water equivalent of the maximum snow melt.", units="kg m-2", compute=xci.snow_melt_we_max, ) snw_max = SnowWithIndexing( + title="Maximum snow amount", identifier="snw_max", standard_name="surface_snow_amount", var_name="{freq}_snw_max", - long_name="Maximum daily snow amount", - description="{freq} day of year when snow amount on the surface reaches its maximum.", + long_name="Maximum snow water equivalent amount", + description="The {freq} maximum snow water equivalent amount on the surface.", + abstract="The maximum snow water equivalent amount on the surface.", units="kg m-2", compute=xci.snw_max, ) snw_max_doy = SnowWithIndexing( + title="Day of year of maximum snow amount", identifier="snw_max_doy", standard_name="day_of_year", var_name="{freq}_snw_max_doy", - long_name="Day of year of maximum daily snow amount", - description="{freq} maximum snow amount on the surface.", + long_name="Day of year of maximum daily snow water equivalent amount", + description="The {freq} day of year when snow water equivalent amount on the surface reaches its maximum.", + abstract="The day of year when snow water equivalent amount on the surface reaches its maximum.", units="", compute=xci.snw_max_doy, ) melt_and_precip_max = Snow( + title="Water equivalent maximum from precipitation and snow melt", identifier="melt_and_precip_max", var_name="{freq}_melt_and_precip_max", - description="{freq} maximum precipitation flux and negative change in snow amount over {window} days.", + long_name="Water equivalent maximum from precipitation and snow melt", + description="The {freq} maximum precipitation flux and negative change in snow amount over {window} days.", + abstract="Maximum water input from precipitation flux and snow melt over a given window of days.", units="kg m-2", compute=xci.melt_and_precip_max, ) winter_storm = SnowWithIndexing( + title="Winter storm days", identifier="winter_storm", var_name="{freq}_winter_storm", - description="{freq} number of days with snowfall accumulation above {thresh}.", + long_name="Days with snowfall at or above a given threshold", + description="The {freq} number of days with snowfall accumulation above {thresh}.", units="days", compute=xci.winter_storm, ) blowing_snow = Snow( + title="Blowing snow days", identifier="blowing_snow", var_name="{freq}_blowing_snow", - description="{freq} number of days with snowfall over last {window} days above {snd_thresh} and wind speed above " - "{sfcWind_thresh}.", + long_name="Days with snowfall and wind speed at or above given thresholds", + description="The {freq} number of days with snowfall over last {window} days above {snd_thresh} and wind speed " + "above {sfcWind_thresh}.", + abstract="The number of days with snowfall, snow depth, and windspeed over given thresholds for a period of days.", units="days", compute=xci.blowing_snow, ) snow_depth = SnowWithIndexing( + title="Mean snow depth", identifier="snow_depth", units="cm", standard_name="surface_snow_thickness", long_name="Mean of daily snow depth", - description="{freq} mean of daily mean snow depth.", + description="The {freq} mean of daily mean snow depth.", + abstract="Mean of daily snow depth.", cell_methods="time: mean over days", compute=xci.snow_depth, ) diff --git a/xclim/indicators/land/_streamflow.py b/xclim/indicators/land/_streamflow.py index 97550b2f4..31197c9e5 100644 --- a/xclim/indicators/land/_streamflow.py +++ b/xclim/indicators/land/_streamflow.py @@ -1,6 +1,8 @@ """Streamflow indicator definitions.""" from __future__ import annotations +from abc import ABC + from xclim.core.cfchecks import check_valid from xclim.core.indicator import Indicator, ResamplingIndicator from xclim.core.units import declare_units @@ -50,7 +52,7 @@ class FA(Streamflow): missing = "skip" -# Disable the daily checks because the inputs are period extremas. +# Disable the daily checks because the inputs are period extremes. class Fit(Indicator): src_freq = None @@ -59,62 +61,68 @@ def cfcheck(self, **das): base_flow_index = Streamflow( + title="Base flow index", identifier="base_flow_index", units="", long_name="Base flow index", - description="Minimum 7-day average flow divided by the mean flow.", + description="Minimum of the 7-day moving average flow divided by the mean flow.", + asbtract="Minimum of the 7-day moving average flow divided by the mean flow.", compute=base_flow_index, ) freq_analysis = FA( + title="Return period flow amount", identifier="freq_analysis", var_name="q{window}{mode:r}{indexer}", - long_name="N-year return period {mode} {indexer} {window}-day flow", - description="Streamflow frequency analysis for the {mode} {indexer} {window}-day flow " - "estimated using the {dist} distribution.", + long_name="N-year return period flow amount", + description="Streamflow frequency analysis for the {mode} {indexer} {window}-day flow estimated using the {dist} " + "distribution.", + abstract="Streamflow frequency analysis on the basis of a given mode and distribution.", units="m^3 s-1", - title="Flow values for given return periods.", compute=declare_units(da=None)(frequency_analysis), ) rb_flashiness_index = Streamflow( + title="Richards-Baker Flashiness Index", identifier="rb_flashiness_index", units="", var_name="rbi", - long_name="Richards-Baker flashiness index", - description="{freq} R-B Index, an index measuring the flashiness of flow.", + long_name="Richards-Baker Flashiness Index", + description="{freq} of Richards-Baker Index, an index measuring the flashiness of flow.", + abstract="Measurement of flow oscillations relative to average flow, " + "quantifying the frequency and speed of flow changes.", compute=rb_flashiness_index, ) stats = Stats( + title="Statistic of the daily flow for a given period.", identifier="stats", var_name="q{indexer}{op:r}", - long_name="{freq} {op} of {indexer} daily flow ", - description="{freq} {op} of {indexer} daily flow", - title="Statistic of the daily flow on a given period.", + long_name="Daily flow statistics", + description="{freq} {op} of daily flow ({indexer}).", units="m^3 s-1", compute=declare_units(da=None)(generic.select_resample_op), ) fit = Fit( + title="Distribution parameters fitted over the time dimension.", identifier="fit", var_name="params", units="", standard_name="{dist} parameters", long_name="{dist} distribution parameters", - description="Parameters of the {dist} distribution", - title="Distribution parameters fitted over the time dimension.", + description="Parameters of the {dist} distribution.", cell_methods="time: fit", compute=declare_units(da=None)(_fit), ) doy_qmax = Streamflow( + title="Day of year of the maximum streamflow", identifier="doy_qmax", var_name="q{indexer}_doy_qmax", - long_name="Day of the year of the maximum over {indexer}", - description="Day of the year of the maximum over {indexer}", - title="Day of year of the maximum.", + long_name="Day of the year of the maximum streamflow over {indexer}", + description="Day of the year of the maximum streamflow over {indexer}.", units="", compute=declare_units(da=None)(generic.select_resample_op), parameters=dict(op=generic.doymax), @@ -122,11 +130,11 @@ def cfcheck(self, **das): doy_qmin = Streamflow( + title="Day of year of the minimum streamflow", identifier="doy_qmin", var_name="q{indexer}_doy_qmin", - long_name="Day of the year of the minimum over {indexer}", - description="Day of the year of the minimum over {indexer}", - title="Day of year of the minimum.", + long_name="Day of the year of the minimum streamflow over {indexer}", + description="Day of the year of the minimum streamflow over {indexer}.", units="", compute=declare_units(da=None)(generic.select_resample_op), parameters=dict(op=generic.doymin), diff --git a/xclim/indicators/seaIce/_seaice.py b/xclim/indicators/seaIce/_seaice.py index 73421020c..b000c1696 100644 --- a/xclim/indicators/seaIce/_seaice.py +++ b/xclim/indicators/seaIce/_seaice.py @@ -18,22 +18,26 @@ class SiconcAreacello(Indicator): sea_ice_extent = SiconcAreacello( + title="Sea ice extent", identifier="sea_ice_extent", units="m2", standard_name="sea_ice_extent", - long_name="Sea ice extent", - description="The sum of ocean areas where sea ice concentration is at least {thresh}.", + long_name="Sum of ocean areas where sea ice concentration exceeds {thresh}", + description="The sum of ocean areas where sea ice concentration exceeds {thresh}.", + abstract="A measure of the extent of all areas where sea ice concentration exceeds a threshold.", cell_methods="lon: sum lat: sum", compute=indices.sea_ice_extent, ) sea_ice_area = SiconcAreacello( + title="Sea ice area", identifier="sea_ice_area", units="m2", standard_name="sea_ice_area", - long_name="Sea ice area", - description="The sum of ice-covered areas where sea ice concentration is at least {thresh}.", + long_name="Sum of ice-covered areas where sea ice concentration exceeds {thresh}", + description="The sum of ice-covered areas where sea ice concentration exceeds {thresh}.", + abstract="A measure of total ocean surface covered by sea ice.", cell_methods="lon: sum lat: sum", compute=indices.sea_ice_area, ) diff --git a/xclim/indices/_multivariate.py b/xclim/indices/_multivariate.py index 2e2954b48..aeab06206 100644 --- a/xclim/indices/_multivariate.py +++ b/xclim/indices/_multivariate.py @@ -1753,7 +1753,7 @@ def blowing_snow( window: int = 3, freq: str = "AS-JUL", ) -> xarray.DataArray: - """Days with blowing snow events. + """Blowing snow days. Number of days when both snowfall over the last days and daily wind speeds are above respective thresholds. diff --git a/xclim/indices/_synoptic.py b/xclim/indices/_synoptic.py index f99743ad7..c40d52dda 100644 --- a/xclim/indices/_synoptic.py +++ b/xclim/indices/_synoptic.py @@ -26,7 +26,8 @@ def jetstream_metric_woollings( """Strength and latitude of jetstream. Identify latitude and strength of maximum smoothed zonal wind speed in the region from 15 to 75°N and -60 to 0°E, - using the formula outlined in :cite:p:`woollings_variability_2010`. + using the formula outlined in :cite:p:`woollings_variability_2010`. Wind is smoothened using a Lanczos filter + approach. Warnings -------- diff --git a/xclim/indices/_threshold.py b/xclim/indices/_threshold.py index 1d54732da..29dc25cc6 100644 --- a/xclim/indices/_threshold.py +++ b/xclim/indices/_threshold.py @@ -94,7 +94,7 @@ def calm_days( ) -> xarray.DataArray: r"""Calm days. - The number of days with average near-surface wind speed below threshold. + The number of days with average near-surface wind speed below threshold (default: 2 m/s). Parameters ---------- @@ -112,8 +112,7 @@ def calm_days( Notes ----- - Let :math:`WS_{ij}` be the windspeed at day :math:`i` of period :math:`j`. Then - counted is the number of days where: + Let :math:`WS_{ij}` be the windspeed at day :math:`i` of period :math:`j`. Then counted is the number of days where: .. math:: @@ -131,12 +130,13 @@ def cold_spell_days( thresh: str = "-10 degC", window: int = 5, freq: str = "AS-JUL", + op: str = "<", resample_before_rl: bool = True, ) -> xarray.DataArray: r"""Cold spell days. The number of days that are part of cold spell events, defined as a sequence of consecutive days with mean daily - temperature below a threshold in °C. + temperature below a threshold (default: -10°C). Parameters ---------- @@ -147,10 +147,12 @@ def cold_spell_days( window : int Minimum number of days with temperature below threshold to qualify as a cold spell. freq : str - Resampling frequency. + Resampling frequency. + op : {"<", "<=", "lt", "le"} + Comparison operation. Default: "<". resample_before_rl : bool - Determines if the resampling should take place before or after the run - length encoding (or a similar algorithm) is applied to runs. + Determines if the resampling should take place before or after the run + length encoding (or a similar algorithm) is applied to runs. Returns ------- @@ -160,7 +162,7 @@ def cold_spell_days( Notes ----- Let :math:`T_i` be the mean daily temperature on day :math:`i`, the number of cold spell days during - period :math:`\phi` is given by + period :math:`\phi` is given by: .. math:: @@ -169,7 +171,8 @@ def cold_spell_days( where :math:`[P]` is 1 if :math:`P` is true, and 0 if false. """ t = convert_units_to(thresh, tas) - over = tas < t + over = compare(tas, op, t, constrain=("<", "<=")) + out = rl.resample_and_rl( over, resample_before_rl, @@ -186,12 +189,13 @@ def cold_spell_frequency( thresh: str = "-10 degC", window: int = 5, freq: str = "AS-JUL", + op: str = "<", resample_before_rl: bool = True, ) -> xarray.DataArray: r"""Cold spell frequency. The number of cold spell events, defined as a sequence of consecutive days with mean daily temperature below a - threshold. + threshold (default: -10℃). Parameters ---------- @@ -202,15 +206,21 @@ def cold_spell_frequency( window : int Minimum number of days with temperature below threshold to qualify as a cold spell. freq : str - Resampling frequency. + Resampling frequency. + op : {"<", "<=", "lt", "le"} + Comparison operation. Default: "<". resample_before_rl : bool - Determines if the resampling should take place before or after the run + Determines if the resampling should take place before or after the run + Returns + ------- + xarray.DataArray, [time] Cold spell frequency. """ t = convert_units_to(thresh, tas) - over = tas < t + over = compare(tas, op, t, constrain=("<", "<=")) + out = rl.resample_and_rl( over, resample_before_rl, @@ -228,8 +238,8 @@ def continuous_snow_cover_end( ) -> xarray.DataArray: r"""End date of continuous snow cover. - First day after the start of the continuous snow cover when snow depth is below `threshold` for at least - `window` consecutive days. + First day after the start of the continuous snow cover when snow depth is below a threshold (default: 2 cm) + for at least `N` (default: 14) consecutive days. Warnings -------- @@ -249,9 +259,9 @@ def continuous_snow_cover_end( Returns ------- xarray.DataArray, [dimensionless] - First day after the start of the continuous snow cover when the snow depth goes below a threshold - for a minimum duration. - If there is no such day, return np.nan. + First day after the start of the continuous snow cover when the snow depth + goes below a threshold for a minimum duration. + If there is no such day, returns np.nan. References ---------- @@ -275,7 +285,8 @@ def continuous_snow_cover_start( ) -> xarray.DataArray: r"""Start date of continuous snow cover. - Day of year when snow depth is above or equal `threshold` for at least `window` consecutive days. + Day of year when snow depth is above or equal to a threshold (default: 2 cm) + for at least `N` (default: 14) consecutive days. Warnings -------- @@ -296,7 +307,7 @@ def continuous_snow_cover_start( ------- xarray.DataArray, [dimensionless] First day of the year when the snow depth is superior to a threshold for a minimum duration. - If there is no such day, return np.nan. + If there is no such day, returns np.nan. References ---------- @@ -326,6 +337,7 @@ def daily_pr_intensity( r"""Average daily precipitation intensity. Return the average precipitation over wet days. + Wet days are those with precipitation over a given threshold (default: 1 mm/day). Parameters ---------- @@ -339,7 +351,7 @@ def daily_pr_intensity( Returns ------- xarray.DataArray, [precipitation] - The average precipitation over wet days for each period + The average precipitation over wet days for each period. Notes ----- @@ -355,7 +367,7 @@ def daily_pr_intensity( Examples -------- The following would compute for each grid cell of file `pr.day.nc` the average precipitation fallen over days with - precipitation >= 5 mm at seasonal frequency, ie DJF, MAM, JJA, SON, DJF, etc.: + precipitation >= 5 mm at seasonal frequency, i.e. DJF, MAM, JJA, SON, DJF, etc.: >>> from xclim.indices import daily_pr_intensity >>> pr = xr.open_dataset(path_to_pr_file).pr @@ -381,7 +393,10 @@ def daily_pr_intensity( @declare_units(pr="[precipitation]", thresh="[precipitation]") def dry_days( - pr: xarray.DataArray, thresh: str = "0.2 mm/d", freq: str = "YS" + pr: xarray.DataArray, + thresh: str = "0.2 mm/d", + freq: str = "YS", + op: str = "<", ) -> xarray.DataArray: r"""Dry days. @@ -395,23 +410,25 @@ def dry_days( Threshold temperature on which to base evaluation. freq : str Resampling frequency. + op : {"<", "<=", "lt", "le"} + Comparison operation. Default: "<". Returns ------- xarray.DataArray, [time] - Number of days with daily precipitation below threshold. + Number of days with daily precipitation {op} threshold. Notes ----- - Let :math:`PR_{ij}` be the daily precipitation at day :math:`i` of period :math:`j`. Then - counted is the number of days where: + Let :math:`PR_{ij}` be the daily precipitation at day :math:`i` of period :math:`j`. Then counted is the number + of days where: .. math:: \sum PR_{ij} < Threshold [mm/day] """ thresh = convert_units_to(thresh, pr) - out = threshold_count(pr, "<", thresh, freq) + out = threshold_count(pr, op, thresh, freq, constrain=("<", "<=")) out = to_agg_units(out, pr, "count") return out @@ -425,7 +442,7 @@ def maximum_consecutive_wet_days( ) -> xarray.DataArray: r"""Consecutive wet days. - Returns the maximum number of consecutive wet days. + Returns the maximum number of consecutive days with precipitation above a given threshold (default: 1 mm/day). Parameters ---------- @@ -476,7 +493,7 @@ def cooling_degree_days( ) -> xarray.DataArray: r"""Cooling degree days. - Sum of degree days above the temperature threshold at which spaces are cooled. + Returns the sum of degree days above the temperature threshold at which spaces are cooled (default: 18℃). Parameters ---------- @@ -506,55 +523,18 @@ def cooling_degree_days( return cumulative_difference(tas, threshold=thresh, op=">", freq=freq) -@declare_units(tas="[temperature]", thresh="[temperature]") def freshet_start( - tas: xarray.DataArray, - thresh: str = "0 degC", - window: int = 5, - freq: str = "YS", - resample_before_rl: bool = True, -) -> xarray.DataArray: - r"""First day consistently exceeding threshold temperature. - - Returns first day of period where a temperature threshold is exceeded over a given number of days. - - Parameters - ---------- - tas : xarray.DataArray - Mean daily temperature. - thresh : str - Threshold temperature on which to base evaluation. - window : int - Minimum number of days with temperature above threshold needed for evaluation. - freq : str - Resampling frequency. - resample_before_rl : bool - Determines if the resampling should take place before or after the run - length encoding (or a similar algorithm) is applied to runs. - - Returns - ------- - xarray.DataArray, [dimensionless] - Day of the year when temperature exceeds threshold over a given number of days for the first time. If there is - no such day, return np.nan. - - Notes - ----- - Let :math:`x_i` be the daily mean temperature at day of the year :math:`i` for values of :math:`i` going from 1 - to 365 or 366. The start date of the freshet is given by the smallest index :math:`i` for which - - .. math:: + tas: xarray.DataArray, thresh="0 degC", window: int = 5, **kwargs +) -> xarray.DataArray: # noqa: D103 + warnings.warn( + "The `freshet_start` indice is being deprecated in favour of `first_day_temperature_above` " + "with `thresh='0 degC'` and `window=5`. " + "This indice will be removed in `xclim>=0.40.0`. Please update your scripts accordingly.", + DeprecationWarning, + stacklevel=3, + ) - \prod_{j=i}^{i+w} [x_j > thresh] - - is true, where :math:`w` is the number of days the temperature threshold should be exceeded, and :math:`[P]` is - 1 if :math:`P` is true, and 0 if false. - """ - thresh = convert_units_to(thresh, tas) - over = tas > thresh - out = over.resample(time=freq).map(rl.first_run, window=window, coord="dayofyear") - out.attrs.update(units="", is_dayofyear=np.int32(1), calendar=get_calendar(tas)) - return out + return first_day_temperature_above(tas=tas, thresh=thresh, window=window, **kwargs) @declare_units(tas="[temperature]", thresh="[temperature]") @@ -563,7 +543,7 @@ def growing_degree_days( ) -> xarray.DataArray: r"""Growing degree-days over threshold temperature value. - The sum of degree-days over the threshold temperature. + The sum of growing degree-days over a given mean daily temperature threshold (default: 4℃). Parameters ---------- @@ -581,7 +561,7 @@ def growing_degree_days( Notes ----- - Let :math:`TG_{ij}` be the daily mean temperature at day :math:`i` of period :math:`j`. Then the + Let :math:`TG_{ij}` be the mean daily temperature at day :math:`i` of period :math:`j`. Then the growing degree days are: .. math:: @@ -597,8 +577,8 @@ def growing_season_start( ) -> xarray.DataArray: r"""Start of the growing season. - Day of the year of the start of a sequence of days with mean temperatures consistently above or equal to a - threshold, after a period with mean temperatures consistently above the same threshold. + Day of the year of the start of a sequence of days with mean daily temperatures consistently above or equal to a + given threshold (default: 5℃). Parameters ---------- @@ -646,8 +626,12 @@ def growing_season_end( ) -> xarray.DataArray: r"""End of the growing season. - Day of the year of the start of a sequence of days with mean temperatures consistently below a threshold, after a - period with mean temperatures consistently above the same threshold. + Day of the year of the start of a sequence of `N` (default: 5) days with mean temperatures consistently below a + given threshold (default: 5℃), occurring after a given calendar date (default: July 1). + + Warnings + -------- + The default `freq` and `mid_date` parameters are valid for the northern hemisphere. Parameters ---------- @@ -693,14 +677,14 @@ def growing_season_length( ) -> xarray.DataArray: r"""Growing season length. - The number of days between the first occurrence of at least six consecutive days with mean daily temperature over a - threshold (default: 5℃) and the first occurrence of at least six consecutive days with mean daily temperature below - the same threshold after a certain date. (Usually July 1st in the northern emisphere and January 1st in the southern - hemisphere.) + The number of days between the first occurrence of at least `N` (default: 6) consecutive days with mean daily + temperature over a threshold (default: 5℃) and the first occurrence of at least `N` consecutive days with mean + daily temperature below the same threshold after a certain date, usually July 1st (06-01) in the northern emispher + and January 1st (01-01) in the southern hemisphere. Warnings -------- - The default `freq` is valid for the northern hemisphere. + The default `freq` and `mid_date` parameters are valid for the northern hemisphere. Parameters ---------- @@ -745,6 +729,11 @@ def growing_season_length( # If working in the Southern Hemisphere, one can use: >>> gsl_sh = growing_season_length(tas, mid_date="01-01", freq="AS-JUL") + + References + ---------- + :cite:cts:`project_team_eca&d_algorithm_2013` + """ thresh = convert_units_to(thresh, tas) cond = tas >= thresh @@ -768,14 +757,14 @@ def frost_season_length( ) -> xarray.DataArray: r"""Frost season length. - The number of days between the first occurrence of at least N (def: 5) consecutive days with minimum daily - temperature under a threshold (default: 0℃) and the first occurrence of at least N (def 5) consecutive days with + The number of days between the first occurrence of at least `N` (default: 5) consecutive days with minimum daily + temperature under a threshold (default: 0℃) and the first occurrence of at least `N` consecutive days with minimum daily temperature above the same threshold. A mid-date can be given to limit the earliest day the end of season can take. Warnings -------- - The default `freq` is valid for the northern hemisphere. + The default `freq` and `mid_date` parameters are valid for the northern hemisphere. Parameters ---------- @@ -844,7 +833,8 @@ def frost_free_season_start( r"""Start of the frost free season. Day of the year of the start of a sequence of days with minimum temperatures consistently above or equal to a - threshold, after a period with minimum temperatures consistently above the same threshold. + threshold (default: 0℃), after a period of `N` days (default: 5) with minimum temperatures consistently + above the same threshold. Parameters ---------- @@ -893,8 +883,13 @@ def frost_free_season_end( ) -> xarray.DataArray: r"""End of the frost free season. - Day of the year of the start of a sequence of days with minimum temperatures consistently - below a threshold, after a period with minimum temperatures consistently above the same threshold. + Day of the year of the start of a sequence of days with minimum temperatures consistently below a threshold + (default: 0℃), after a period of `N` days (default: 5) with minimum temperatures consistently above the same + threshold. + + Warnings + -------- + The default `freq` and `mid_date` parameters are valid for the northern hemisphere. Parameters ---------- @@ -940,14 +935,14 @@ def frost_free_season_length( ) -> xarray.DataArray: r"""Frost free season length. - The number of days between the first occurrence of at least N (def: 5) consecutive days with minimum daily - temperature above a threshold (default: 0℃) and the first occurrence of at least N (def 5) consecutive days with + The number of days between the first occurrence of at least `N` (default: 5) consecutive days with minimum daily + temperature above a threshold (default: 0℃) and the first occurrence of at least `N` consecutive days with minimum daily temperature below the same threshold. A mid-date can be given to limit the earliest day the end of season can take. Warnings -------- - The default `freq` is valid for the northern hemisphere. + The default `freq` and `mid_date` parameters are valid for the northern hemisphere. Parameters ---------- @@ -1006,6 +1001,7 @@ def frost_free_season_length( return to_agg_units(out, tasmin, "count") +# FIXME: `tas` should instead be `tasmin` if we want to follow expected definitions. @declare_units(tas="[temperature]", thresh="[temperature]") def last_spring_frost( tas: xarray.DataArray, @@ -1016,8 +1012,12 @@ def last_spring_frost( ) -> xarray.DataArray: r"""Last day of temperatures inferior to a threshold temperature. - Returns last day of period where a temperature is inferior to a threshold over a given number of days and limited - to a final calendar date. + Returns last day of period where a temperature is inferior to a threshold over a given number of days (default: 1) + and limited to a final calendar date (default: July 1). + + Warnings + -------- + The default `freq` and `before_date` parameters are valid for the northern hemisphere. Parameters ---------- @@ -1093,12 +1093,12 @@ def first_day_temperature_below( ) -> xarray.DataArray: r"""First day of temperatures inferior to a given temperature threshold. - Returns first day of period where temperature is inferior to a threshold over a given number of days, - limited to a starting calendar date. + Returns first day of period where temperature is inferior to a threshold over a given number of days (default: 1), + limited to a starting calendar date (default: July 1). Warnings -------- - The default `freq` is valid for the northern hemisphere. + The default `freq` and `after_date` parameters are valid for the northern hemisphere. Parameters ---------- @@ -1145,12 +1145,12 @@ def first_day_temperature_above( ) -> xarray.DataArray: r"""First day of temperatures superior to a given temperature threshold. - Returns first day of period where temperature is superior to a threshold over a given number of days, - limited to a starting calendar date. + Returns first day of period where temperature is superior to a threshold over a given number of days (default: 1), + limited to a starting calendar date (default: January 1). Warnings -------- - The default `freq` is valid for the northern hemisphere. + The default `freq` and `after_date` parameters are valid for the northern hemisphere. Parameters ---------- @@ -1172,6 +1172,18 @@ def first_day_temperature_above( xarray.DataArray, [dimensionless] Day of the year when temperature is superior to a threshold over a given number of days for the first time. If there is no such day, returns np.nan. + + Notes + ----- + Let :math:`x_i` be the daily mean|max|min temperature at day of the year :math:`i` for values of :math:`i` going + from 1 to 365 or 366. The first day above temperature threshold is given by the smallest index :math:`i` for which + + .. math:: + + \prod_{j=i}^{i+w} [x_j > thresh] + + is true, where :math:`w` is the number of days the temperature threshold should be exceeded, and :math:`[P]` is + 1 if :math:`P` is true, and 0 if false. """ return first_day_threshold_reached( tas, @@ -1192,7 +1204,7 @@ def first_snowfall( ) -> xarray.DataArray: r"""First day with solid precipitation above a threshold. - Returns the first day of a period where the solid precipitation exceeds a threshold. + Returns the first day of a period where the solid precipitation exceeds a threshold (default: 0.5 mm/day). Warnings -------- @@ -1238,7 +1250,7 @@ def last_snowfall( ) -> xarray.DataArray: r"""Last day with solid precipitation above a threshold. - Returns the last day of a period where the solid precipitation exceeds a threshold. + Returns the last day of a period where the solid precipitation exceeds a threshold (default: 0.5 mm/day). Warnings -------- @@ -1320,10 +1332,11 @@ def heat_wave_index( thresh: str = "25.0 degC", window: int = 5, freq: str = "YS", + op: str = ">", ) -> xarray.DataArray: """Heat wave index. - Number of days that are part of a heatwave, defined as five or more consecutive days over 25℃. + Number of days that are part of a heatwave, defined as five or more consecutive days over a threshold of 25℃. Parameters ---------- @@ -1335,6 +1348,8 @@ def heat_wave_index( Minimum number of days with temperature above threshold to qualify as a heatwave. freq : str Resampling frequency. + op : {">", ">=", "gt", "ge"} + Comparison operation. Default: ">". Returns ------- @@ -1342,7 +1357,7 @@ def heat_wave_index( Heat wave index. """ thresh = convert_units_to(thresh, tasmax) - over = tasmax > thresh + over = compare(tasmax, op, thresh, constrain=(">", ">=")) group = over.resample(time=freq) out = group.map(rl.windowed_run_count, window=window, dim="time") @@ -1355,7 +1370,7 @@ def heating_degree_days( ) -> xarray.DataArray: r"""Heating degree days. - Sum of degree days below the temperature threshold at which spaces are heated. + Sum of degree days below the temperature threshold (default: 17℃) at which spaces are heated. Parameters ---------- @@ -1393,12 +1408,13 @@ def hot_spell_max_length( thresh_tasmax: str = "30 degC", window: int = 1, freq: str = "YS", + op: str = ">", ) -> xarray.DataArray: r"""Longest hot spell. Longest spell of high temperatures over a given period. - The longest series of consecutive days with tasmax ≥ 30 °C. Here, there is no minimum threshold for number of - days in a row that must be reached or exceeded to count as a spell. A year with zero +30 °C days will return a + The longest series of consecutive days with tasmax at or above 30°C. Here, there is no minimum threshold for number + of days in a row that must be reached or exceeded to count as a spell. A year with zero +30°C days will return a longest spell value of zero. Parameters @@ -1411,6 +1427,8 @@ def hot_spell_max_length( Minimum number of days with temperatures above thresholds to qualify as a heatwave. freq : str Resampling frequency. + op : {">", ">=", "gt", "ge"} + Comparison operation. Default: ">". Returns ------- @@ -1424,7 +1442,8 @@ def hot_spell_max_length( characterize the occurrence of hot weather events that can result in adverse health outcomes for Canadian communities :cite:p:`casati_regional_2013`. - In :cite:t:`robinson_definition_2001`, the parameters would be `thresh_tasmin=27.22, thresh_tasmax=39.44, window=2` (81F, 103F). + In :cite:t:`robinson_definition_2001`, the parameters would be + `thresh_tasmin=27.22, thresh_tasmax=39.44, window=2` (81F, 103F). References ---------- @@ -1432,7 +1451,7 @@ def hot_spell_max_length( """ thresh_tasmax = convert_units_to(thresh_tasmax, tasmax) - cond = tasmax > thresh_tasmax + cond = compare(tasmax, op, thresh_tasmax, constrain=(">", ">=")) group = cond.resample(time=freq) max_l = group.map(rl.longest_run, dim="time") out = max_l.where(max_l >= window, 0) @@ -1445,11 +1464,12 @@ def hot_spell_frequency( thresh_tasmax: str = "30 degC", window: int = 3, freq: str = "YS", + op: str = ">", ) -> xarray.DataArray: """Hot spell frequency. Number of hot spells over a given period. A hot spell is defined as an event where the - maximum daily temperature exceeds a specific threshold over a minimum number of days. + maximum daily temperature exceeds a specific threshold (default: 30℃) over a minimum number of days (default: 3). Parameters ---------- @@ -1461,6 +1481,8 @@ def hot_spell_frequency( Minimum number of days with temperatures above thresholds to qualify as a heatwave. freq : str Resampling frequency. + op : {">", ">=", "gt", "ge"} + Comparison operation. Default: ">". Returns ------- @@ -1482,7 +1504,7 @@ def hot_spell_frequency( """ thresh_tasmax = convert_units_to(thresh_tasmax, tasmax) - cond = tasmax > thresh_tasmax + cond = compare(tasmax, op, thresh_tasmax, constrain=(">", ">=")) group = cond.resample(time=freq) out = group.map(rl.windowed_run_events, window=window, dim="time") out.attrs["units"] = "" @@ -1496,7 +1518,7 @@ def snow_cover_duration( # noqa: D401 """Number of days with snow depth above a threshold. - Number of days where surface snow depth is greater or equal to given threshold. + Number of days where surface snow depth is greater or equal to given threshold (default: 2 cm). Warnings -------- @@ -1530,7 +1552,7 @@ def tn_days_above( ): # noqa: D401 """Number of days with tasmin above a threshold (number of tropical nights). - Number of days where daily minimum temperature exceeds a threshold. + Number of days where minimum daily temperature exceeds a threshold (default: 20℃). Parameters ---------- @@ -1546,11 +1568,11 @@ def tn_days_above( Returns ------- xarray.DataArray, [time] - Number of days where tasmin > threshold. + Number of days where tasmin {op} threshold. Notes ----- - Let :math:`TN_{ij}` be the daily minimum temperature at day :math:`i` of period :math:`j`. Then + Let :math:`TN_{ij}` be the minimum daily temperature at day :math:`i` of period :math:`j`. Then counted is the number of days where: .. math:: @@ -1571,7 +1593,7 @@ def tn_days_below( ) -> xarray.DataArray: # noqa: D401 """Number of days with tasmin below a threshold. - Number of days where daily minimum temperature is below a threshold. + Number of days where minimum daily temperature is below a threshold (default: -10℃). Parameters ---------- @@ -1587,11 +1609,11 @@ def tn_days_below( Returns ------- xarray.DataArray, [time] - Number of days where tasmin < threshold. + Number of days where tasmin {op} threshold. Notes ----- - Let :math:`TN_{ij}` be the daily minimum temperature at day :math:`i` of period :math:`j`. Then + Let :math:`TN_{ij}` be the minimum daily temperature at day :math:`i` of period :math:`j`. Then counted is the number of days where: .. math:: @@ -1612,7 +1634,7 @@ def tg_days_above( ): # noqa: D401 """Number of days with tas above a threshold. - Number of days where daily mean temperature exceeds a threshold. + Number of days where mean daily temperature exceeds a threshold (default: 10℃). Parameters ---------- @@ -1628,11 +1650,11 @@ def tg_days_above( Returns ------- xarray.DataArray, [time] - Number of days where tas > threshold. + Number of days where tas {op} threshold. Notes ----- - Let :math:`TG_{ij}` be the daily mean temperature at day :math:`i` of period :math:`j`. Then + Let :math:`TG_{ij}` be the mean daily temperature at day :math:`i` of period :math:`j`. Then counted is the number of days where: .. math:: @@ -1653,7 +1675,7 @@ def tg_days_below( ): # noqa: D401 """Number of days with tas below a threshold. - Number of days where daily mean temperature is below a threshold. + Number of days where mean daily temperature is below a threshold (default: 10℃). Parameters ---------- @@ -1669,11 +1691,11 @@ def tg_days_below( Returns ------- xarray.DataArray, [time] - Number of days where tas < threshold. + Number of days where tas {op} threshold. Notes ----- - Let :math:`TG_{ij}` be the daily mean temperature at day :math:`i` of period :math:`j`. Then counted is the number + Let :math:`TG_{ij}` be the mean daily temperature at day :math:`i` of period :math:`j`. Then counted is the number of days where: .. math:: @@ -1694,7 +1716,7 @@ def tx_days_above( ) -> xarray.DataArray: # noqa: D401 """Number of days with tasmax above a threshold (number of summer days). - Number of days where daily maximum temperature exceeds a threshold. + Number of days where maximum daily temperature exceeds a threshold (default: 25℃). Parameters ---------- @@ -1710,12 +1732,12 @@ def tx_days_above( Returns ------- xarray.DataArray, [time] - Number of days where tasmax > threshold (number of summer days). + Number of days where tasmax {op} threshold (number of summer days). Notes ----- - Let :math:`TX_{ij}` be the daily maximum temperature at day :math:`i` of period :math:`j`. Then - counted is the number of days where: + Let :math:`TX_{ij}` be the maximum daily temperature at day :math:`i` of period :math:`j`. Then counted is the + number of days where: .. math:: @@ -1735,7 +1757,7 @@ def tx_days_below( ): # noqa: D401 """Number of days with tmax below a threshold. - Number of days where daily maximum temperature is below a threshold. + Number of days where maximum daily temperature is below a threshold (default: 25℃). Parameters ---------- @@ -1751,16 +1773,16 @@ def tx_days_below( Returns ------- xarray.DataArray, [time] - Number of days where tasmin < threshold. + Number of days where tasmin {op} threshold. Notes ----- - Let :math:`TN_{ij}` be the daily minimum temperature at day :math:`i` of period :math:`j`. Then + Let :math:`TX_{ij}` be the maximum daily temperature at day :math:`i` of period :math:`j`. Then counted is the number of days where: .. math:: - TN_{ij} < Threshold [℃] + TX_{ij} < Threshold [℃] """ thresh = convert_units_to(thresh, tasmax) f1 = threshold_count(tasmax, op, thresh, freq, constrain=("<", "<=")) @@ -1769,47 +1791,49 @@ def tx_days_below( @declare_units(tasmax="[temperature]", thresh="[temperature]") def warm_day_frequency( - tasmax: xarray.DataArray, thresh: str = "30 degC", freq: str = "YS" + tasmax: xarray.DataArray, thresh: str = "30 degC", freq: str = "YS", op: str = ">" ) -> xarray.DataArray: """Frequency of extreme warm days. - Return the number of days with tasmax > thresh per period + Return the number of days with maximum daily temperature exceeding threshold (default: 30℃) per period. Parameters ---------- tasmax : xarray.DataArray - Mean daily temperature. + Maximum daily temperature. thresh : str Threshold temperature on which to base evaluation. freq : str Resampling frequency. + op : {">", ">=", "gt", "ge"} + Comparison operation. Default: ">". Returns ------- xarray.DataArray, [time] - Number of days with tasmax > threshold per period. + Number of days with tasmax {op} threshold per period. Notes ----- - Let :math:`TX_{ij}` be the daily maximum temperature at day :math:`i` of period :math:`j`. Then - counted is the number of days where: + Let :math:`TX_{ij}` be the maximum daily temperature at day :math:`i` of period :math:`j`. Then counted is the + number of days where: .. math:: TN_{ij} > Threshold [℃] """ thresh = convert_units_to(thresh, tasmax) - events = threshold_count(tasmax, ">", thresh, freq) + events = threshold_count(tasmax, op, thresh, freq, constrain=(">", ">=")) return to_agg_units(events, tasmax, "count") @declare_units(tasmin="[temperature]", thresh="[temperature]") def warm_night_frequency( - tasmin: xarray.DataArray, thresh: str = "22 degC", freq: str = "YS" + tasmin: xarray.DataArray, thresh: str = "22 degC", freq: str = "YS", op: str = ">" ) -> xarray.DataArray: """Frequency of extreme warm nights. - Return the number of days with tasmin > thresh per period + Return the number of days with minimum daily temperature exceeding threshold (default: 22℃) per period. Parameters ---------- @@ -1819,24 +1843,29 @@ def warm_night_frequency( Threshold temperature on which to base evaluation. freq : str Resampling frequency. + op : {">", ">=", "gt", "ge"} + Comparison operation. Default: ">". Returns ------- xarray.DataArray, [time] - Number of days with tasmin > threshold per period. + Number of days with tasmin {op} threshold per period. """ thresh = convert_units_to(thresh, tasmin) - events = threshold_count(tasmin, ">", thresh, freq) + events = threshold_count(tasmin, op, thresh, freq, constrain=(">", ">=")) return to_agg_units(events, tasmin, "count") @declare_units(pr="[precipitation]", thresh="[precipitation]") def wetdays( - pr: xarray.DataArray, thresh: str = "1.0 mm/day", freq: str = "YS" + pr: xarray.DataArray, + thresh: str = "1.0 mm/day", + freq: str = "YS", + op: str = ">=", ) -> xarray.DataArray: """Wet days. - Return the total number of days during period with precipitation over threshold. + Return the total number of days during period with precipitation over threshold (default: 1.0 mm/day). Parameters ---------- @@ -1846,6 +1875,8 @@ def wetdays( Precipitation value over which a day is considered wet. freq : str Resampling frequency. + op : {">", ">=", "gt", "ge"} + Comparison operation. Default: ">=". Returns ------- @@ -1854,8 +1885,8 @@ def wetdays( Examples -------- - The following would compute for each grid cell of file `pr.day.nc` the number days - with precipitation over 5 mm at the seasonal frequency, ie DJF, MAM, JJA, SON, DJF, etc.: + The following would compute for each grid cell of file `pr.day.nc` the number days with precipitation over 5 mm + at the seasonal frequency, i.e. DJF, MAM, JJA, SON, DJF, etc.: >>> from xclim.indices import wetdays >>> pr = xr.open_dataset(path_to_pr_file).pr @@ -1863,17 +1894,20 @@ def wetdays( """ thresh = convert_units_to(thresh, pr, "hydro") - wd = threshold_count(pr, ">=", thresh, freq) + wd = threshold_count(pr, op, thresh, freq, constrain=(">", ">=")) return to_agg_units(wd, pr, "count") @declare_units(pr="[precipitation]", thresh="[precipitation]") def wetdays_prop( - pr: xarray.DataArray, thresh: str = "1.0 mm/day", freq: str = "YS" + pr: xarray.DataArray, + thresh: str = "1.0 mm/day", + freq: str = "YS", + op: str = ">=", ) -> xarray.DataArray: """Proportion of wet days. - Return the proportion of days during period with precipitation over threshold. + Return the proportion of days during period with precipitation over threshold (default: 1.0 mm/day). Parameters ---------- @@ -1883,6 +1917,8 @@ def wetdays_prop( Precipitation value over which a day is considered wet. freq : str Resampling frequency. + op : {">", ">=", "gt", "ge"} + Comparison operation. Default: ">=". Returns ------- @@ -1891,8 +1927,8 @@ def wetdays_prop( Examples -------- - The following would compute for each grid cell of file `pr.day.nc` the proportion of days - with precipitation over 5 mm at the seasonal frequency, ie DJF, MAM, JJA, SON, DJF, etc.: + The following would compute for each grid cell of file `pr.day.nc` the proportion of days with precipitation over + 5 mm at the seasonal frequency, i.e. DJF, MAM, JJA, SON, DJF, etc.: >>> from xclim.indices import wetdays_prop >>> pr = xr.open_dataset(path_to_pr_file).pr @@ -1900,7 +1936,7 @@ def wetdays_prop( """ thresh = convert_units_to(thresh, pr, "hydro") - wd = compare(pr, ">=", thresh) + wd = compare(pr, op, thresh, constrain=(">", ">=")) fwd = wd.resample(time=freq).mean(dim="time").assign_attrs(units="1") return fwd @@ -1913,8 +1949,8 @@ def maximum_consecutive_frost_days( ) -> xarray.DataArray: r"""Maximum number of consecutive frost days (Tn < 0℃). - The maximum number of consecutive days within the period where the - temperature is under a certain threshold (default: 0°C). + The maximum number of consecutive days within the period where the minimum daily temperature + is under a given threshold (default: 0°C). Warnings -------- @@ -1936,14 +1972,14 @@ def maximum_consecutive_frost_days( Notes ----- - Let :math:`\mathbf{t}=t_0, t_1, \ldots, t_n` be a daily minimum temperature series and :math:`thresh` the threshold + Let :math:`\mathbf{t}=t_0, t_1, \ldots, t_n` be a minimum daily temperature series and :math:`thresh` the threshold below which a day is considered a frost day. Let :math:`\mathbf{s}` be the sorted vector of indices :math:`i` where :math:`[t_i < thresh] \neq [t_{i+1} < thresh]`, that is, the days where the temperature crosses the threshold. - Then the maximum number of consecutive frost free days is given by + Then the maximum number of consecutive frost days is given by .. math:: - \max(\mathbf{d}) \quad \mathrm{where} \quad d_j = (s_j - s_{j-1}) [t_{s_j} > thresh] + \max(\mathbf{d}) \quad \mathrm{where} \quad d_j = (s_j - s_{j-1}) [t_{s_j} < thresh] where :math:`[P]` is 1 if :math:`P` is true, and 0 if false. Note that this formula does not handle sequences at the start and end of the series, but the numerical algorithm does. @@ -1960,7 +1996,8 @@ def maximum_consecutive_dry_days( ) -> xarray.DataArray: r"""Maximum number of consecutive dry days. - Return the maximum number of consecutive days within the period where precipitation is below a certain threshold. + Return the maximum number of consecutive days within the period where precipitation + is below a certain threshold (default: 1 mm/day). Parameters ---------- @@ -1985,7 +2022,7 @@ def maximum_consecutive_dry_days( .. math:: - \max(\mathbf{d}) \quad \mathrm{where} \quad d_j = (s_j - s_{j-1}) [p_{s_j} > thresh] + \max(\mathbf{d}) \quad \mathrm{where} \quad d_j = (s_j - s_{j-1}) [p_{s_j} < thresh] where :math:`[P]` is 1 if :math:`P` is true, and 0 if false. Note that this formula does not handle sequences at the start and end of the series, but the numerical algorithm does. @@ -2002,8 +2039,12 @@ def maximum_consecutive_frost_free_days( ) -> xarray.DataArray: r"""Maximum number of consecutive frost free days (Tn >= 0℃). - Return the maximum number of consecutive days within the period where the - minimum temperature is above or equal to a certain threshold. + Return the maximum number of consecutive days within the period where the minimum daily temperature is + above or equal to a certain threshold (default: 0℃). + + Warnings + -------- + The default `freq` is valid for the northern hemisphere. Parameters ---------- @@ -2045,8 +2086,8 @@ def maximum_consecutive_tx_days( ) -> xarray.DataArray: r"""Maximum number of consecutive days with tasmax above a threshold (summer days). - Return the maximum number of consecutive days within the period where the maximum temperature is above a certain - threshold. + Return the maximum number of consecutive days within the period where the maximum daily temperature is + above a certain threshold (default: 25℃). Parameters ---------- @@ -2067,7 +2108,7 @@ def maximum_consecutive_tx_days( Let :math:`\mathbf{t}=t_0, t_1, \ldots, t_n` be a daily maximum temperature series and :math:`thresh` the threshold above which a day is considered a summer day. Let :math:`\mathbf{s}` be the sorted vector of indices :math:`i` where :math:`[t_i < thresh] \neq [t_{i+1} < thresh]`, that is, the days where the temperature crosses the threshold. - Then the maximum number of consecutive dry days is given by: + Then the maximum number of consecutive tx_days (summer days) is given by: .. math:: @@ -2127,7 +2168,7 @@ def sea_ice_extent( """Total sea ice extent. Sea ice extent measures the *ice-covered* area, where a region is considered ice-covered if its sea ice - concentration is above a threshold usually set to 15%. + concentration is above a threshold, usually set to 15%. Parameters ---------- @@ -2163,7 +2204,7 @@ def windy_days( ) -> xarray.DataArray: r"""Windy days. - The number of days with average near-surface wind speed above threshold. + The number of days with average near-surface wind speed above threshold (default: 10.8 m/s). Parameters ---------- @@ -2181,8 +2222,7 @@ def windy_days( Notes ----- - Let :math:`WS_{ij}` be the windspeed at day :math:`i` of period :math:`j`. Then - counted is the number of days where: + Let :math:`WS_{ij}` be the windspeed at day :math:`i` of period :math:`j`. Then counted is the number of days where: .. math:: @@ -2202,7 +2242,7 @@ def tropical_nights( ) -> xarray.DataArray: """Tropical nights. - The number of days with minimum daily temperature above threshold. + The number of days with minimum daily temperature above threshold (default: 20℃). Parameters ---------- @@ -2252,7 +2292,7 @@ def rprctot( """Proportion of accumulated precipitation arising from convective processes. Return the proportion of total accumulated precipitation due to convection on days with total precipitation - exceeding a specified threshold during the given period. + exceeding a given threshold (default: 1.0 mm/day) during the given period. Parameters ---------- @@ -2294,8 +2334,8 @@ def degree_days_exceedance_date( ) -> xarray.DataArray: r"""Degree-days exceedance date. - Day of year when the sum of degree days exceeds a threshold. Degree days are computed above or below a given - temperature threshold. + Day of year when the sum of degree days exceeds a threshold (default: 25 K days). + Degree days are computed above or below a given temperature threshold (default: 0℃). Parameters ---------- @@ -2309,8 +2349,8 @@ def degree_days_exceedance_date( If equivalent to '>', degree days are computed as `tas - thresh` and if equivalent to '<', they are computed as `thresh - tas`. after_date: str, optional - Date at which to start the cumulative sum. In "mm-dd" format, defaults to the - start of the sampling period. + Date at which to start the cumulative sum. + In "mm-dd" format, defaults to the start of the sampling period. freq : str Resampling frequency. If `after_date` is given, `freq` should be annual. @@ -2372,7 +2412,11 @@ def winter_storm( ) -> xarray.DataArray: """Days with snowfall over threshold. - Number of days with snowfall accumulation greater or equal to threshold. + Number of days with snowfall accumulation greater or equal to threshold (default: 25 cm). + + Warnings + -------- + The default `freq` is valid for the northern hemisphere. Parameters ---------- diff --git a/xclim/testing/tests/test_formatting.py b/xclim/testing/tests/test_formatting.py index 991f5a2ec..7388c4859 100644 --- a/xclim/testing/tests/test_formatting.py +++ b/xclim/testing/tests/test_formatting.py @@ -25,18 +25,20 @@ def test_prefix_attrs(): def test_indicator_docstring(): doc = heat_wave_frequency.__doc__.split("\n") - assert doc[0] == "Heat wave frequency. (realm: atmos)" + assert doc[0] == "Heat wave frequency (realm: atmos)" assert ( doc[5] == "Based on indice :py:func:`~xclim.indices._multivariate.heat_wave_frequency`." ) assert doc[6] == "Keywords : health,." assert doc[12] == " Default : `ds.tasmin`. [Required units : [temperature]]" - assert doc[41] == ( - " Number of heat wave events (Tmin > {thresh_tasmin} and Tmax > {thresh_tasmax} for >= {window} days) " - "(heat_wave_events), with additional attributes: **description**: {freq} number of heat wave events " - "over a given period. An event occurs when the minimum and maximum daily temperature both exceeds specific " - "thresholds : (Tmin > {thresh_tasmin} and Tmax > {thresh_tasmax}) over a minimum number of days ({window})." + assert ( + doc[41] + == " Total number of series of at least {window} consecutive days with daily minimum temperature above " + "{thresh_tasmin} and daily maximum temperature above {thresh_tasmax} (heat_wave_events), " + "with additional attributes: **description**: {freq} number of heat wave events within a given period. " + "A heat wave occurs when daily minimum and maximum temperatures exceed {thresh_tasmin} and {thresh_tasmax}, " + "respectively, over at least {window} days." ) doc = degree_days_exceedance_date.__doc__.split("\n") diff --git a/xclim/testing/tests/test_indicators.py b/xclim/testing/tests/test_indicators.py index 0bb32c940..0fcf904c1 100644 --- a/xclim/testing/tests/test_indicators.py +++ b/xclim/testing/tests/test_indicators.py @@ -503,14 +503,20 @@ def test_identifier(): def test_formatting(pr_series): out = atmos.wetdays(pr_series(np.arange(366)), thresh=1.0 * units.mm / units.day) # pint 0.10 now pretty print day as d. - assert out.attrs["long_name"] in [ - "Number of wet days (precip >= 1 mm/day)", - "Number of wet days (precip >= 1 mm/d)", + assert ( + out.attrs["long_name"] + == "Number of days with daily precipitation at or above 1 mm/d" + ) + assert out.attrs["description"] in [ + "Annual number of days with daily precipitation at or above 1 mm/d." ] out = atmos.wetdays(pr_series(np.arange(366)), thresh=1.5 * units.mm / units.day) - assert out.attrs["long_name"] in [ - "Number of wet days (precip >= 1.5 mm/day)", - "Number of wet days (precip >= 1.5 mm/d)", + assert ( + out.attrs["long_name"] + == "Number of days with daily precipitation at or above 1.5 mm/d" + ) + assert out.attrs["description"] in [ + "Annual number of days with daily precipitation at or above 1.5 mm/d." ] diff --git a/xclim/testing/tests/test_indices.py b/xclim/testing/tests/test_indices.py index bfe32ff7f..8167aa50a 100644 --- a/xclim/testing/tests/test_indices.py +++ b/xclim/testing/tests/test_indices.py @@ -807,7 +807,11 @@ def test_simple(self, tas_series): tg[i : i + w + 1] += 6 # Second valid condition, should be ignored. tg = tas_series(tg + K2C, start="1/1/2000") - out = xci.freshet_start(tg, window=w) + + # Check for DeprecationWarning + with pytest.warns(DeprecationWarning): + out = xci.freshet_start(tg, window=w) + assert out[0] == tg.indexes["time"][30].dayofyear for attr in ["units", "is_dayofyear", "calendar"]: assert attr in out.attrs.keys() @@ -1147,35 +1151,43 @@ def test_1d( class TestHotSpellFrequency: @pytest.mark.parametrize( - "thresh_tasmax,window,expected", + "thresh_tasmax,window,op,expected", [ - ("30 C", 3, 2), # Some HS - ("30 C", 4, 1), # One long HS - ("10 C", 3, 1), # No HS - ("40 C", 5, 0), # Windowed + ("30 C", 3, ">", 2), # Some HS + ("30 C", 4, ">", 1), # One long HS + ("29 C", 3, ">", 2), # Two HS + ("29 C", 3, ">=", 1), # One long HS + ("10 C", 3, ">", 1), # No HS + ("40 C", 5, ">", 0), # Windowed ], ) - def test_1d(self, tasmax_series, thresh_tasmax, window, expected): + def test_1d(self, tasmax_series, thresh_tasmax, window, op, expected): tx = tasmax_series(np.asarray([29, 31, 31, 31, 29, 31, 31, 31, 31, 31]) + K2C) - hsf = xci.hot_spell_frequency(tx, thresh_tasmax=thresh_tasmax, window=window) + hsf = xci.hot_spell_frequency( + tx, thresh_tasmax=thresh_tasmax, window=window, op=op + ) np.testing.assert_allclose(hsf.values, expected) class TestHotSpellMaxLength: @pytest.mark.parametrize( - "thresh_tasmax,window,expected", + "thresh_tasmax,window,op,expected", [ - ("30 C", 3, 5), # Some HS - ("10 C", 3, 10), # One long HS - ("40 C", 3, 0), # No HS - ("30 C", 5, 5), # Windowed + ("30 C", 3, ">", 5), # Some HS + ("10 C", 3, ">", 10), # One long HS + ("29 C", 3, ">", 5), # Two HS + ("29 C", 3, ">=", 9), # One long HS, minus a day + ("40 C", 3, ">", 0), # No HS + ("30 C", 5, ">", 5), # Windowed ], ) - def test_1d(self, tasmax_series, thresh_tasmax, window, expected): - tx = tasmax_series(np.asarray([29, 31, 31, 31, 29, 31, 31, 31, 31, 31]) + K2C) + def test_1d(self, tasmax_series, thresh_tasmax, window, op, expected): + tx = tasmax_series(np.asarray([28, 31, 31, 31, 29, 31, 31, 31, 31, 31]) + K2C) - hsml = xci.hot_spell_max_length(tx, thresh_tasmax=thresh_tasmax, window=window) + hsml = xci.hot_spell_max_length( + tx, thresh_tasmax=thresh_tasmax, window=window, op=op + ) np.testing.assert_allclose(hsml.values, expected) @@ -2989,26 +3001,32 @@ def test_simple(self, pr_series, prc_series): class TestWetDays: def test_simple(self, pr_series): a = np.zeros(365) - a[:6] += [4, 5.5, 6, 6, 2, 7] # 4 above 5 in Jan - a[100:105] += [1, 6, 7, 2, 1] # 2 above 5 in Mar + a[:7] += [4, 5.5, 6, 6, 2, 7, 5] # 4 above 5 and 1 at 5 in Jan + a[100:106] += [1, 6, 7, 5, 2, 1] # 2 above 5 and 1 at 5 in Mar pr = pr_series(a) pr.attrs["units"] = "mm/day" out = xci.wetdays(pr, thresh="5 mm/day", freq="M") + np.testing.assert_allclose(out, [5, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0]) + + out = xci.wetdays(pr, thresh="5 mm/day", freq="M", op=">") np.testing.assert_allclose(out, [4, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0]) class TestWetDaysProp: def test_simple(self, pr_series): a = np.zeros(365) - a[:6] += [4, 5.5, 6, 6, 2, 7] # 4 above 5 in Jan - a[100:105] += [1, 6, 7, 2, 1] # 2 above 5 in Mar + a[:7] += [4, 5.5, 6, 6, 2, 7, 5] # 4 above 5 and 1 at 5 in Jan + a[100:106] += [1, 6, 7, 5, 2, 1] # 2 above 5 and 1 at 5 in Mar pr = pr_series(a) pr.attrs["units"] = "mm/day" out = xci.wetdays_prop(pr, thresh="5 mm/day", freq="M") + np.testing.assert_allclose(out, [5 / 31, 0, 0, 3 / 31, 0, 0, 0, 0, 0, 0, 0, 0]) + + out = xci.wetdays_prop(pr, thresh="5 mm/day", freq="M", op=">") np.testing.assert_allclose(out, [4 / 31, 0, 0, 2 / 31, 0, 0, 0, 0, 0, 0, 0, 0]) diff --git a/xclim/testing/tests/test_land.py b/xclim/testing/tests/test_land.py index 258f69828..24de73a2b 100644 --- a/xclim/testing/tests/test_land.py +++ b/xclim/testing/tests/test_land.py @@ -23,14 +23,22 @@ def test_simple(self, ndq_series): out = land.freq_analysis( ndq_series, mode="max", t=[2, 5], dist="gamma", season="DJF" ) - assert out.long_name == "N-year return period maximal winter 1-day flow" + assert out.long_name == "N-year return period flow amount" + assert out.description in [ + "Streamflow frequency analysis for the maximal winter 1-day flow " + "estimated using the gamma distribution." + ] assert out.name == "q1maxwinter" assert out.shape == (2, 2, 3) # nrt, nx, ny np.testing.assert_array_equal(out.isnull(), False) def test_no_indexer(self, ndq_series): out = land.freq_analysis(ndq_series, mode="max", t=[2, 5], dist="gamma") - assert out.long_name == "N-year return period maximal annual 1-day flow" + assert out.long_name == "N-year return period flow amount" + assert out.description in [ + "Streamflow frequency analysis for the maximal annual 1-day flow " + "estimated using the gamma distribution." + ] assert out.name == "q1maxannual" assert out.shape == (2, 2, 3) # nrt, nx, ny np.testing.assert_array_equal(out.isnull(), False) diff --git a/xclim/testing/tests/test_locales.py b/xclim/testing/tests/test_locales.py index 41022ee17..8a8e9d6fe 100644 --- a/xclim/testing/tests/test_locales.py +++ b/xclim/testing/tests/test_locales.py @@ -43,7 +43,9 @@ def test_local_dict(tmp_path): loc, dic = xloc.get_local_dict("fr") assert loc == "fr" - assert dic["TG_MEAN"]["long_name"] == "Moyenne de la température journalière" + assert ( + dic["TG_MEAN"]["long_name"] == "Moyenne de la température moyenne quotidienne" + ) loc, dic = xloc.get_local_dict(esperanto) assert loc == "eo" @@ -62,7 +64,9 @@ def test_local_dict(tmp_path): loc, dic = xloc.get_local_dict(("fr", {"TX_MAX": {"long_name": "Fait chaud."}})) assert loc == "fr" assert dic["TX_MAX"]["long_name"] == "Fait chaud." - assert dic["TG_MEAN"]["long_name"] == "Moyenne de la température journalière" + assert ( + dic["TG_MEAN"]["long_name"] == "Moyenne de la température moyenne quotidienne" + ) def test_local_attrs_sing(): @@ -72,9 +76,7 @@ def test_local_attrs_sing(): assert "description" not in attrs with pytest.raises(ValueError): - attrs = xloc.get_local_attrs( - atmos.tg_mean, "fr", esperanto, append_locale_name=False - ) + xloc.get_local_attrs(atmos.tg_mean, "fr", esperanto, append_locale_name=False) def test_local_attrs_multi(tmp_path): @@ -109,7 +111,7 @@ def test_indicator_output(tas_series): assert "long_name_fr" in tgmean.attrs assert ( tgmean.attrs["description_fr"] - == "Moyenne annuelle de la température journalière." + == "Moyenne annuelle de la température quotidienne." ) @@ -154,7 +156,10 @@ def test_xclim_translations(locale, official_indicators): if len(untranslated) > 0 or len(incomplete) > 0: pytest.fail( - f"Indicators {', '.join(untranslated)} do not have translations and {', '.join(incomplete)} have incomplete ones for official locale {locale}." + f"{len(untranslated)} indicators are missing translations" + f"{': [' + ', '.join(untranslated) + ']' if len(untranslated) else ''}" + f"{' and ' if len(incomplete) else '.'}" + f"[{', '.join(incomplete)}] have incomplete translations for official locale `{locale}`." ) diff --git a/xclim/testing/tests/test_precip.py b/xclim/testing/tests/test_precip.py index fad29bcf3..902a8293a 100644 --- a/xclim/testing/tests/test_precip.py +++ b/xclim/testing/tests/test_precip.py @@ -79,8 +79,8 @@ def test_with_different_phases(self): np.testing.assert_array_almost_equal(out_liq + out_sol, out_tot, 4) - assert "solid" in out_sol.long_name - assert "liquid" in out_liq.long_name + assert "solid" in out_sol.description + assert "liquid" in out_liq.description assert out_sol.standard_name == "lwe_thickness_of_snowfall_amount" # With a non-default threshold @@ -573,15 +573,15 @@ def test_dry_spell(atmosds): np.testing.assert_allclose(total_d_max, [76, 97], rtol=1e-1) assert ( - "The annual number of dry periods of 7 days and more, during which the total " - "precipitation on a window of 7 days is under 3 mm." + "The annual number of dry periods of 7 day(s) or more, " + "during which the total precipitation on a window of 7 day(s) is below 3 mm." ) in events.description assert ( - "The annual number of days in dry periods of 7 days and more" + "The annual number of days in dry periods of 7 day(s) or more" in total_d_sum.description ) assert ( - "The annual number of days in dry periods of 7 days and more" + "The annual number of days in dry periods of 7 day(s) or more" in total_d_max.description ) @@ -617,10 +617,10 @@ def test_dry_spell_frequency_op(): np.testing.assert_allclose(test_sum[0, 2], [1], rtol=1e-1) np.testing.assert_allclose(test_max[0, 2], [2], rtol=1e-1) assert ( - "The monthly number of dry periods of 7 days and more, during which the total precipitation " - "on a window of 7 days is under 3 mm." + "The monthly number of dry periods of 7 day(s) or more, " + "during which the total precipitation on a window of 7 day(s) is below 3 mm." ) in test_sum.description assert ( - "The monthly number of dry periods of 7 days and more, during which the maximal precipitation " - "on a window of 7 days is under 3 mm." + "The monthly number of dry periods of 7 day(s) or more, " + "during which the maximal precipitation on a window of 7 day(s) is below 3 mm." ) in test_max.description diff --git a/xclim/testing/tests/test_temperature.py b/xclim/testing/tests/test_temperature.py index eeb70eed1..147570dad 100644 --- a/xclim/testing/tests/test_temperature.py +++ b/xclim/testing/tests/test_temperature.py @@ -362,7 +362,7 @@ def test_real_data(self, atmosds): test = atmos.maximum_consecutive_frost_free_days(tasmin) np.testing.assert_allclose(test[2, 0], [68], rtol=1e-1) assert ( - "Annual maximum number of consecutive days with minimum daily temperature above or equal to 0 degc." + "Annual maximum number of consecutive days with minimum daily temperature at or above 0 degc." ) in test.description @@ -1224,7 +1224,20 @@ def test_degree_days_exceedance_date(): sum_thresh="200 K days", ) np.testing.assert_array_equal(out, np.array([[153, 136, 9, 6]]).T) - assert "tmean > 4 degc" in out.attrs["description"] + assert ( + "Day of year when the integral of degree days (mean daily temperature > 4 degc) exceeds 200 k days." + in out.attrs["description"] + ) + + out = atmos.degree_days_exceedance_date( + tas=tas, thresh="4 degC", op=">", sum_thresh="200 K days", after_date="07-01" + ) + np.testing.assert_array_equal(out, np.array([[199, 193, 190, 190]]).T) + assert ( + "Day of year when the integral of degree days (mean daily temperature > 4 degc) " + "exceeds 200 k days, with the cumulative sum starting from 07-01." + in out.attrs["description"] + ) with set_options(check_missing="skip"): out = atmos.degree_days_exceedance_date( @@ -1238,44 +1251,45 @@ def test_degree_days_exceedance_date(): np.testing.assert_array_equal(out, np.array([[np.nan, 280, 241, 244]]).T) -def test_warm_spell_duration_index(): - tasmax = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc").tasmax - tx90 = percentile_doy(tasmax, window=5, per=90) +class TestWarmSpellDurationIndex: + def test_warm_spell_duration_index(self): + tasmax = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc").tasmax + tx90 = percentile_doy(tasmax, window=5, per=90) - out = atmos.warm_spell_duration_index( - tasmax=tasmax, tasmax_per=tx90, window=3, freq="AS-JUL" - ) - np.testing.assert_array_equal( - out.isel(location=0, percentiles=0), np.array([np.nan, 3, 0, 0, np.nan]) - ) - assert "Annual number of days with at least 3 consecutive days" in out.description + out = atmos.warm_spell_duration_index( + tasmax=tasmax, tasmax_per=tx90, window=3, freq="AS-JUL" + ) + np.testing.assert_array_equal( + out.isel(location=0, percentiles=0), np.array([np.nan, 3, 0, 0, np.nan]) + ) + assert ( + "Annual number of days with at least 3 consecutive days" in out.description + ) + def test_wsdi_custom_percentiles_parameters(self): + # GIVEN + tasmax = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc").tasmax + tasmax_per = tasmax.sel(time=slice("01-01-1990", "31-12-1991")) + # WHEN + tx90 = percentile_doy(tasmax_per, per=[42, 24], window=2) + out = atmos.warm_spell_duration_index(tasmax, tx90, freq="YS") + # THEN + assert "[42 24]th" in out.attrs["description"] + assert "2 day(s) window" in out.attrs["description"] + assert "['1990-01-01', '1991-12-31']" in out.attrs["description"] -def test_wsdi__custom_percentiles_params(): - # GIVEN - tasmax = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc").tasmax - tasmax_per = tasmax.sel(time=slice("01-01-1990", "31-12-1991")) - # WHEN - tx90 = percentile_doy(tasmax_per, per=[42, 24], window=2) - out = atmos.warm_spell_duration_index(tasmax, tx90, freq="YS") - # THEN - assert "[42 24]th" in out.attrs["description"] - assert "2 day(s) window" in out.attrs["description"] - assert "['1990-01-01', '1991-12-31']" in out.attrs["description"] - - -def test_wsdi__default_percentiles_params(): - # GIVEN - tasmax = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc").tasmax - tasmax_per = tasmax.sel(time=slice("01-01-1990", "31-12-1991")) - # WHEN - tx90 = percentile_doy(tasmax_per, per=[42, 24], window=2) - del tx90.attrs["climatology_bounds"] - res = atmos.warm_spell_duration_index(tasmax, tx90, freq="YS") - # THEN - assert "{unkown} day(s) window" in res.attrs["description"] - assert "{unkown} period" in res.attrs["description"] - assert "{unkown}th percentile(s)" in res.attrs["description"] + def test_wsdi_default_percentiles_parameters(self): + # GIVEN + tasmax = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc").tasmax + tasmax_per = tasmax.sel(time=slice("01-01-1990", "31-12-1991")) + # WHEN + tx90 = percentile_doy(tasmax_per, per=[42, 24], window=2) + del tx90.attrs["climatology_bounds"] + res = atmos.warm_spell_duration_index(tasmax, tx90, freq="YS") + # THEN + assert "{unknown} day(s) window" in res.attrs["description"] + assert "{unknown} period" in res.attrs["description"] + assert "{unknown}th percentile(s)" in res.attrs["description"] def test_maximum_consecutive_warm_days(): @@ -1283,7 +1297,7 @@ def test_maximum_consecutive_warm_days(): out = atmos.maximum_consecutive_warm_days(tasmax) np.testing.assert_array_equal(out[1, :], np.array([13, 21, 6, 10])) assert ( - "Annual longest spell of consecutive days with tmax above 25 degc." + "Annual longest spell of consecutive days with maximum daily temperature above 25 degc." in out.description ) @@ -1310,65 +1324,88 @@ def test_corn_heat_units(): ) assert ( - "specific thresholds : tmin > 4.44 degc and tmax > 10 degc." in chu.description + "minimum and maximum daily temperatures both exceed 4.44 degc and 10 degc, respectively." + in chu.description ) -def test_freezethaw_spell_frequency(): - ds = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc") +class TestFreezeThawSpell: + def test_freezethaw_spell_frequency(self): + ds = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc") - out = atmos.freezethaw_spell_frequency( - tasmin=ds.tasmin, tasmax=ds.tasmax, freq="YS" - ) - np.testing.assert_array_equal(out.isel(location=0), [32, 38, 37, 30]) - - # At location -1, year 2 has no spells of length >=2 - out = atmos.freezethaw_spell_frequency( - tasmin=convert_units_to(ds.tasmin, "degF"), - tasmax=ds.tasmax, - window=2, - freq="YS", - ) - np.testing.assert_array_equal(out.isel(location=-1), [1, 0, 1, 1]) + out = atmos.freezethaw_spell_frequency( + tasmin=ds.tasmin, tasmax=ds.tasmax, freq="YS" + ) + np.testing.assert_array_equal(out.isel(location=0), [32, 38, 37, 30]) - assert out.attrs["long_name"] == "Annual number of freeze-thaw spells." + # At location -1, year 2 has no spells of length >=2 + out = atmos.freezethaw_spell_frequency( + tasmin=convert_units_to(ds.tasmin, "degF"), + tasmax=ds.tasmax, + window=2, + freq="YS", + ) + np.testing.assert_array_equal(out.isel(location=-1), [1, 0, 1, 1]) + assert out.attrs["long_name"] == ( + "Frequency of events where maximum daily temperatures are above 0 degc " + "and minimum daily temperatures are at or below 0 degc for at least 2 consecutive day(s)." + ) + assert out.attrs["description"] in [ + "Annual number of freeze-thaw spells, where maximum daily temperatures are above 0 degc " + "and minimum daily temperatures are at or below 0 degc for at least 2 consecutive day(s)." + ] -def test_freezethaw_spell_mean_length(): - ds = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc") + def test_freezethaw_spell_mean_length(self): + ds = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc") - out = atmos.freezethaw_spell_mean_length( - tasmin=ds.tasmin, tasmax=ds.tasmax, freq="YS" - ) - np.testing.assert_allclose(out.isel(location=0), [2.09375, 2, 1.8648648, 1.7666666]) - - # At location -1, year 2 has no spells of length >=2 - out = atmos.freezethaw_spell_mean_length( - tasmin=convert_units_to(ds.tasmin, "degF"), - tasmax=ds.tasmax, - window=2, - freq="YS", - ) - np.testing.assert_array_equal(out.isel(location=-1), [2, 0, 2, 2]) + out = atmos.freezethaw_spell_mean_length( + tasmin=ds.tasmin, tasmax=ds.tasmax, freq="YS" + ) + np.testing.assert_allclose( + out.isel(location=0), [2.09375, 2, 1.8648648, 1.7666666] + ) - assert out.attrs["long_name"] == "Annual average length of freeze-thaw spells." + # At location -1, year 2 has no spells of length >=2 + out = atmos.freezethaw_spell_mean_length( + tasmin=convert_units_to(ds.tasmin, "degF"), + tasmax=ds.tasmax, + window=2, + freq="YS", + ) + np.testing.assert_array_equal(out.isel(location=-1), [2, 0, 2, 2]) + assert out.attrs["long_name"] == ( + "Average length of events where maximum daily temperatures are above 0 degc " + "and minimum daily temperatures are at or below 0 degc for at least 2 consecutive day(s)." + ) + assert out.attrs["description"] in [ + "Annual average length of freeze-thaw spells, where maximum daily temperatures are above 0 degc " + "and minimum daily temperatures are at or below 0 degc for at least 2 consecutive day(s)." + ] -def test_freezethaw_spell_max_length(): - ds = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc") + def test_freezethaw_spell_max_length(self): + ds = open_dataset("ERA5/daily_surface_cancities_1990-1993.nc") - out = atmos.freezethaw_spell_max_length( - tasmin=ds.tasmin, tasmax=ds.tasmax, freq="YS" - ) - np.testing.assert_array_equal(out.isel(location=0), [12, 7, 7, 4]) - - # At location -1, year 2 has no spells of length >=2 - out = atmos.freezethaw_spell_max_length( - tasmin=convert_units_to(ds.tasmin, "degF"), - tasmax=ds.tasmax, - window=2, - freq="YS", - ) - np.testing.assert_array_equal(out.isel(location=-1), [2, 0, 2, 2]) + out = atmos.freezethaw_spell_max_length( + tasmin=ds.tasmin, tasmax=ds.tasmax, freq="YS" + ) + np.testing.assert_array_equal(out.isel(location=0), [12, 7, 7, 4]) - assert out.attrs["long_name"] == "Annual maximal length of freeze-thaw spells." + # At location -1, year 2 has no spells of length >=2 + out = atmos.freezethaw_spell_max_length( + tasmin=convert_units_to(ds.tasmin, "degF"), + tasmax=ds.tasmax, + window=2, + freq="YS", + ) + np.testing.assert_array_equal(out.isel(location=-1), [2, 0, 2, 2]) + + assert out.attrs["long_name"] == ( + "Maximal length of events where maximum daily temperatures are above 0 degc " + "and minimum daily temperatures are at or below 0 degc for at least 2 consecutive day(s)." + ) + assert out.attrs["description"] in [ + "Annual maximal length of freeze-thaw spells, where maximum daily temperatures are above 0 degc " + "and minimum daily temperatures are at or below 0 degc for at least 2 consecutive day(s)." + ]