From 06791bf085285d0e85a561abba733da06e0b2957 Mon Sep 17 00:00:00 2001 From: Jacob Mims <122570226+jtmims@users.noreply.github.com> Date: Mon, 20 May 2024 12:07:39 -0500 Subject: [PATCH 1/4] fix conditional in datelabel.py (#567) --- src/util/datelabel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/datelabel.py b/src/util/datelabel.py index 219ddcb68..e835ab604 100644 --- a/src/util/datelabel.py +++ b/src/util/datelabel.py @@ -1148,7 +1148,7 @@ def format(self): if self.unit == 'fx': return 'fx' else: - if self.quantity == '1': + if self.quantity == 1: return self.unit else: return "{}{}".format(self.quantity, self.unit) From bac974644bb6fd6b64d986330f5518de5851b561 Mon Sep 17 00:00:00 2001 From: Jacob Mims <122570226+jtmims@users.noreply.github.com> Date: Mon, 20 May 2024 12:47:51 -0500 Subject: [PATCH 2/4] fix check_group_daterange function in preprocessor.py (#568) * fix conditional in datelabel.py * fix check_group_daterange function in preprocessor.py --- src/preprocessor.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/preprocessor.py b/src/preprocessor.py index 9f4f714a4..8356396f0 100644 --- a/src/preprocessor.py +++ b/src/preprocessor.py @@ -809,6 +809,17 @@ def check_group_daterange(self, group_df: pd.DataFrame, log=_log) -> pd.DataFram if not hasattr(group_df, 'start_time') or not hasattr(group_df, 'end_time'): raise AttributeError('Data catalog is missing attributes `start_time` and/or `end_time`') try: + if not isinstance(group_df['start_time'].values[0], datetime.date): + # convert int to date type + date_format = '' + date_digits = math.floor(math.log10(group_df['start_time'].values[0]))+1 + match date_digits: + case 8: + date_format = '%Y%m%d' + case 14: + date_format = '%Y%m%d%H%M%S' + group_df['start_time'] = pd.to_datetime(group_df['start_time'].values[0], format=date_format) + group_df['end_time'] = pd.to_datetime(group_df['end_time'].values[0], format=date_format) # method throws ValueError if ranges aren't contiguous dates_df = group_df.loc[:, ['start_time', 'end_time']] date_range_vals = [] From 80475941c9293a042799cf326d8854f857b49eb5 Mon Sep 17 00:00:00 2001 From: Jacob Mims <122570226+jtmims@users.noreply.github.com> Date: Mon, 20 May 2024 16:46:10 -0500 Subject: [PATCH 3/4] update imports in preprocessor.py (#569) * fix conditional in datelabel.py * fix check_group_daterange function in preprocessor.py * update imports in preprocessor.py --- src/preprocessor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/preprocessor.py b/src/preprocessor.py index 8356396f0..ab4a167a3 100644 --- a/src/preprocessor.py +++ b/src/preprocessor.py @@ -11,6 +11,7 @@ from src import util, varlist_util, translation, xr_parser, units import cftime import intake +import math import numpy as np import xarray as xr import collections From 7560e74e00342182087d9496bc5ac30f8307f701 Mon Sep 17 00:00:00 2001 From: Jess <20195932+wrongkindofdoctor@users.noreply.github.com> Date: Mon, 20 May 2024 17:50:58 -0400 Subject: [PATCH 4/4] More pr stuff (#570) * add property and setter methods to DataModel DmVariable class attributes that are updated in the preprocessor * update the translation attributes in each varlistentry with setter functions in the precip rate and level extraction edit_routines and return the original varlistentry append the 4-D variable as an alternate attribute in the level extraction function * remove unused imports from preprocessor --- src/data_model.py | 59 +++++++++++++++++++++++++++++++++++++++++++++ src/preprocessor.py | 16 +++++++++--- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/data_model.py b/src/data_model.py index a3d2217d0..dfa3b2a1c 100644 --- a/src/data_model.py +++ b/src/data_model.py @@ -608,6 +608,10 @@ def dim_axes(self): """ return self.build_axes(self.dims, verify=False) + @dim_axes.setter + def dim_axes(self, value): + self._dim_axes = value + @property def X(self): """Return X axis dimension coordinate if defined, else None.""" @@ -638,6 +642,10 @@ def dim_axes_set(self): """Return frozenset of dimension coordinate axes labels.""" return frozenset(self.dim_axes.keys()) + @dim_axes_set.setter + def dim_axes_set(self, value): + self._dim_axes_set = value + @property def is_static(self): """Whether the variable has time dependence (bool).""" @@ -773,6 +781,10 @@ def axes(self): """ return self.build_axes(self.dims, self.scalar_coords, verify=False) + @axes.setter + def axes(self, value): + self._axes = value + @property def axes_set(self): """Superset of the :meth:`dim_axes_set` frozenset (which contains axes labels @@ -781,6 +793,53 @@ def axes_set(self): """ return frozenset(self.axes.keys()) + @axes_set.setter + def axes_set(self, value): + self._axes_set = value + + @property + def name(self): + return self._name + + @name.setter + def name(self, value: str): + self._name = value + + @property + def standard_name(self): + return self._standard_name + + @standard_name.setter + def standard_name(self, value: str): + self._standard_name = value.lower() + + @property + def units(self): + return self._units + + @units.setter + def units(self, value): + self._units = value + + @property + def long_name(self): + return self._long_name + + @long_name.setter + def long_name(self, value: str): + self._long_name = value + + @property + def realm(self): + return self._realm + + @realm.setter + def realm(self, value: str): + self._realm = value + + + + def add_scalar(self, ax, ax_value, **kwargs): """Metadata operation corresponding to taking a slice of a higher-dimensional variable (extracting its values at axis *ax* = *ax_value*). The diff --git a/src/preprocessor.py b/src/preprocessor.py index ab4a167a3..31b1bedd4 100644 --- a/src/preprocessor.py +++ b/src/preprocessor.py @@ -270,7 +270,7 @@ def edit_request(self, v: varlist_util.VarlistEntry, **kwargs): The signature of this method is altered by the :func:`edit_request_wrapper` decorator. """ - v_to_translate = None + std_name = getattr(v, 'standard_name', "") if std_name not in self._rate_d and std_name not in self._flux_d: # logic not applicable to this VE; do nothing and return varlistEntry for @@ -310,7 +310,10 @@ def edit_request(self, v: varlist_util.VarlistEntry, **kwargs): return None new_v = copy_as_alternate(v) new_v.translation = new_tv - return new_v + v.translation.standard_name = new_tv.standard_name + v.translation.units = new_tv.units + v.translation.long_name = new_tv.long_name + return v def execute(self, var, ds, **kwargs): """Convert units of dependent variable *ds* between precip rate and @@ -565,7 +568,14 @@ def edit_request(self, v: varlist_util.VarlistEntry, **kwargs): ) new_v = copy_as_alternate(v) new_v.translation = new_tv - return new_v + v.alternates.append(v.translation) + v.translation.name = new_tv.name + v.translation.long_name = new_tv.long_name + v.translation.units = new_tv.units + v.translation.dim_axes = new_tv.dim_axes + v.translation.dim_axes_set = new_tv.dim_axes_set + + return v def execute(self, var, ds, **kwargs): """Determine if level extraction is needed (if *var* has a scalar Z