From 34612c5b9f0a6d1b228b68e30a3d6dbc79c1537e Mon Sep 17 00:00:00 2001 From: Valentin Gebhart Date: Tue, 9 Dec 2025 12:13:25 +0100 Subject: [PATCH 1/3] adapt from_hdf5 and write_hdf5 --- climada/hazard/io.py | 10 +++++++++- climada/hazard/test/test_forecast.py | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/climada/hazard/io.py b/climada/hazard/io.py index 6f8bd01b09..03e608d050 100644 --- a/climada/hazard/io.py +++ b/climada/hazard/io.py @@ -917,6 +917,10 @@ def write_hdf5(self, file_name, todense=False): # Centroids have their own write_hdf5 method, # which is invoked at the end of this method (s.b.) continue + elif var_name == "lead_time": + hf_data.create_dataset( + var_name, data=var_val.astype("timedelta64[ns]").astype("int64") + ) elif isinstance(var_val, sparse.csr_matrix): if todense: hf_data.create_dataset(var_name, data=var_val.toarray()) @@ -987,7 +991,11 @@ def from_hdf5(cls, file_name): continue if var_name == "centroids": continue - if isinstance(var_val, np.ndarray) and var_val.ndim == 1: + if var_name == "lead_time": + hazard_kwargs[var_name] = np.array(hf_data.get(var_name)).astype( + "timedelta64[ns]" + ) + elif isinstance(var_val, np.ndarray) and var_val.ndim == 1: hazard_kwargs[var_name] = np.array(hf_data.get(var_name)) elif isinstance(var_val, sparse.csr_matrix): hf_csr = hf_data.get(var_name) diff --git a/climada/hazard/test/test_forecast.py b/climada/hazard/test/test_forecast.py index 646ccaa0cf..5b8321f0b2 100644 --- a/climada/hazard/test/test_forecast.py +++ b/climada/hazard/test/test_forecast.py @@ -107,3 +107,19 @@ def test_hazard_forecast_select(haz_fc, lead_time, member): npt.assert_array_equal(haz_fc_select.event_id, haz_fc.event_id[np.array([3, 0])]) npt.assert_array_equal(haz_fc_select.member, member[np.array([3, 0])]) npt.assert_array_equal(haz_fc_select.lead_time, lead_time[np.array([3, 0])]) + + +def test_write_read_hazard_forecast(haz_fc, tmp_path): + + file_name = tmp_path / "test_hazard_forecast.h5" + + haz_fc.write_hdf5(file_name) + haz_fc_read = HazardForecast.from_hdf5(file_name) + + assert haz_fc_read.lead_time.dtype == np.dtype("timedelta64[ns]") + assert haz_fc_read.member.dtype == int + for key in haz_fc.__dict__.keys(): + if key not in ["intensity", "fraction"]: + npt.assert_array_equal(haz_fc.__dict__[key], haz_fc_read.__dict__[key]) + else: + (haz_fc.__dict__[key] != haz_fc_read.__dict__[key]).nnz == 0 From e123b7bf1b37ee81c7a89d269cf8a60eaba80a1c Mon Sep 17 00:00:00 2001 From: Valentin Gebhart Date: Tue, 9 Dec 2025 13:47:39 +0100 Subject: [PATCH 2/3] implement code review --- climada/hazard/test/test_forecast.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/climada/hazard/test/test_forecast.py b/climada/hazard/test/test_forecast.py index 5b8321f0b2..cc8f373995 100644 --- a/climada/hazard/test/test_forecast.py +++ b/climada/hazard/test/test_forecast.py @@ -116,10 +116,10 @@ def test_write_read_hazard_forecast(haz_fc, tmp_path): haz_fc.write_hdf5(file_name) haz_fc_read = HazardForecast.from_hdf5(file_name) - assert haz_fc_read.lead_time.dtype == np.dtype("timedelta64[ns]") - assert haz_fc_read.member.dtype == int + assert haz_fc_read.lead_time.dtype.kind == np.dtype("timedelta64").kind + for key in haz_fc.__dict__.keys(): - if key not in ["intensity", "fraction"]: - npt.assert_array_equal(haz_fc.__dict__[key], haz_fc_read.__dict__[key]) - else: + if key in ["intensity", "fraction"]: (haz_fc.__dict__[key] != haz_fc_read.__dict__[key]).nnz == 0 + else: + npt.assert_array_equal(haz_fc.__dict__[key], haz_fc_read.__dict__[key]) From 9ce7f73b7572a5b6434992884199795972e93ed8 Mon Sep 17 00:00:00 2001 From: Valentin Gebhart Date: Tue, 9 Dec 2025 14:05:44 +0100 Subject: [PATCH 3/3] add comment to test --- climada/hazard/test/test_forecast.py | 1 + 1 file changed, 1 insertion(+) diff --git a/climada/hazard/test/test_forecast.py b/climada/hazard/test/test_forecast.py index cc8f373995..a91078aa87 100644 --- a/climada/hazard/test/test_forecast.py +++ b/climada/hazard/test/test_forecast.py @@ -122,4 +122,5 @@ def test_write_read_hazard_forecast(haz_fc, tmp_path): if key in ["intensity", "fraction"]: (haz_fc.__dict__[key] != haz_fc_read.__dict__[key]).nnz == 0 else: + # npt.assert_array_equal also works for comparing int, float or list npt.assert_array_equal(haz_fc.__dict__[key], haz_fc_read.__dict__[key])