Skip to content

Commit 70836d0

Browse files
committed
Merge branch 'release/0.21.1'
2 parents 78d26db + 26f776a commit 70836d0

File tree

4 files changed

+54
-5
lines changed

4 files changed

+54
-5
lines changed

climetlab/readers/netcdf/field.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def to_bounding_box(self):
8484
)
8585

8686
@cached_property
87-
def projection(self):
87+
def grid_mapping(self):
8888
def tidy(x):
8989
if isinstance(x, np.ndarray):
9090
return x.tolist()
@@ -105,9 +105,6 @@ def tidy(x):
105105
def grid_points(self):
106106
return DataSet(self.owner.xr_dataset).grid_points(self.variable)
107107

108-
def grid_points_xy(self):
109-
return DataSet(self.owner.xr_dataset).grid_points_xy(self.variable)
110-
111108
def to_numpy(self, reshape=True, dtype=None):
112109
dimensions = dict((s.name, s.index) for s in self.slices)
113110
values = self.owner.xr_dataset[self.variable].isel(dimensions).values

climetlab/sources/constants.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,37 @@ def cos_solar_zenith_angle(self, date):
181181
)
182182
return result.flatten()
183183

184+
def __getattr__(self, name):
185+
if not "+" in name and not "-" in name:
186+
# If we are here, we are looking for a method that does not exist,
187+
# it has to be a method with a time delta.
188+
raise AttributeError(name)
189+
if "+" in name:
190+
fname, delta = name.split("+")
191+
sign = 1
192+
if "-" in name:
193+
fname, delta = name.split("-")
194+
sign = -1
195+
method = getattr(self, fname)
196+
197+
if delta.endswith("h"):
198+
factor = 60
199+
elif delta.endswith("d"):
200+
factor = 24 * 60
201+
else:
202+
raise ValueError(f"Invalid time delta {delta} in {name}")
203+
204+
delta = delta[:-1]
205+
delta = int(delta)
206+
delta = datetime.timedelta(minutes=delta) * factor * sign
207+
208+
def wrapper(date):
209+
date = date + delta
210+
value = method(date)
211+
return value
212+
213+
return wrapper
214+
184215

185216
class ConstantField:
186217
def __init__(

climetlab/version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.21.0
1+
0.21.1

tests/sources/test_constants.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#
1111

1212
import datetime
13+
import numpy as np
1314

1415
from climetlab import load_source
1516
from climetlab.testing import climetlab_file
@@ -86,6 +87,26 @@ def test_constant_2():
8687
assert len(ds) == len(params) * len(dates) * ntimes
8788

8889

90+
def test_constant_3():
91+
sample = load_source("file", climetlab_file("docs/examples/test.grib"))
92+
93+
date = sample[0].datetime()
94+
date_plus_6h = date + datetime.timedelta(hours=6)
95+
a = load_source("constants", sample, date=date_plus_6h, param="insolation")
96+
b = load_source("constants", sample, date=date, param="insolation+6h")
97+
assert np.all(a.to_numpy() == b.to_numpy())
98+
assert a.unique_values("param")["param"] == ("insolation",)
99+
assert b.unique_values("param")["param"] == ("insolation+6h",)
100+
101+
date = sample[0].datetime()
102+
date_minus_30d = date + datetime.timedelta(days=-30)
103+
a = load_source("constants", sample, date=date_minus_30d, param="insolation")
104+
b = load_source("constants", sample, date=date, param="insolation-30d")
105+
assert np.all(a.to_numpy() == b.to_numpy())
106+
assert a.unique_values("param")["param"] == ("insolation",)
107+
assert b.unique_values("param")["param"] == ("insolation-30d",)
108+
109+
89110
if __name__ == "__main__":
90111
from climetlab.testing import main
91112

0 commit comments

Comments
 (0)