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 9f4f714a4..31b1bedd4 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 @@ -269,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 @@ -309,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 @@ -564,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 @@ -809,6 +820,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 = [] 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)