Skip to content

Commit 65c519b

Browse files
committed
Reconstruct missing time coordinate in collapse_by_validity_time
1 parent 8dda87d commit 65c519b

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

src/CSET/operators/collapse.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414

1515
"""Operators to perform various kind of collapse on either 1 or 2 dimensions."""
1616

17+
import datetime
1718
import warnings
1819

1920
import iris
2021
import iris.analysis
2122
import iris.coord_categorisation
23+
import iris.coords
2224
import iris.cube
2325
import iris.util
2426

@@ -264,8 +266,24 @@ def collapse_by_validity_time(
264266
new_cubelist = iris.cube.CubeList(
265267
cube.slices_over(["forecast_period", "forecast_reference_time"])
266268
)
267-
# Remove forecast_period and forecast_reference_time coordinates.
268269
for sub_cube in new_cubelist:
270+
# Reconstruct the time coordinate if it is missing.
271+
if "time" not in [coord.name() for coord in sub_cube.coords()]:
272+
ref_time_coord = sub_cube.coord("forecast_reference_time")
273+
ref_units = ref_time_coord.units
274+
ref_time = ref_units.num2date(ref_time_coord.points)
275+
period_coord = sub_cube.coord("forecast_period")
276+
period_units = period_coord.units
277+
# Given how we are slicing there will only be one point.
278+
period_seconds = period_units.convert(period_coord.points[0], "seconds")
279+
period_duration = datetime.timedelta(seconds=period_seconds)
280+
time = ref_time + period_duration
281+
time_points = ref_units.date2num(time)
282+
time_coord = iris.coords.AuxCoord(
283+
points=time_points, standard_name="time", units=ref_units
284+
)
285+
sub_cube.add_aux_coord(time_coord)
286+
# Remove forecast_period and forecast_reference_time coordinates.
269287
sub_cube.remove_coord("forecast_period")
270288
sub_cube.remove_coord("forecast_reference_time")
271289
# Create new CubeList by merging with unique = False to produce a validity

tests/operators/test_collapse.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ def test_collapse_by_validity_time(long_forecast_multi_day):
150150
assert repr(collapsed_cube) == expected_cube
151151

152152

153+
def test_collapse_by_validity_time_no_time_coordinate(long_forecast_multi_day):
154+
"""Collapse a cube without a time coordinate by validity time."""
155+
long_forecast_multi_day.remove_coord("time")
156+
collapsed_cube = collapse.collapse_by_validity_time(long_forecast_multi_day, "MEAN")
157+
expected_cube = "<iris 'Cube' of air_temperature / (K) (time: 145; grid_latitude: 3; grid_longitude: 3)>"
158+
assert repr(collapsed_cube) == expected_cube
159+
160+
153161
def test_collapse_by_validity_time_percentile(long_forecast_multi_day):
154162
"""Reduce by validity time with percentiles."""
155163
# Test successful collapsing by validity time.

0 commit comments

Comments
 (0)