From c818c92fca183fbd73f35a489e64c3568a784c67 Mon Sep 17 00:00:00 2001 From: Iain Russell Date: Wed, 28 Oct 2026 17:01:14 +0000 Subject: [PATCH] Fix sorting of ensemble members in fieldsets [MPY-408] --- metview/metviewpy/indexdb.py | 2 +- metview/metviewpy/indexer.py | 2 +- metview/metviewpy/param.py | 4 ++-- tests/test_indexer.py | 35 ++++++++++++++++++++++++++++++----- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/metview/metviewpy/indexdb.py b/metview/metviewpy/indexdb.py index 860102d..259a504 100644 --- a/metview/metviewpy/indexdb.py +++ b/metview/metviewpy/indexdb.py @@ -473,7 +473,7 @@ def ls(self, extra_keys=None, filter=None, no_print=False): r = df["number"].unique() skip = False if len(r) == 1: - skip = r[0] in ["0", None] + skip = r[0] in [0, "0", None] if skip: df.drop("number", axis=1, inplace=True) diff --git a/metview/metviewpy/indexer.py b/metview/metviewpy/indexer.py index e94ed72..a901c2d 100644 --- a/metview/metviewpy/indexer.py +++ b/metview/metviewpy/indexer.py @@ -45,7 +45,7 @@ class GribIndexer: "step": ("l", "Int32", int, True), "level": ("l", "Int32", int, True), "typeOfLevel": ("s", str, str, False), - "number": ("s", str, str, True), + "number": ("l", "Int32", int, True), "experimentVersionNumber": ("s", str, str, False), "marsClass": ("s", str, str, False), "marsStream": ("s", str, str, False), diff --git a/metview/metviewpy/param.py b/metview/metviewpy/param.py index 7ba5033..637a5af 100644 --- a/metview/metviewpy/param.py +++ b/metview/metviewpy/param.py @@ -349,7 +349,7 @@ def describe(db, param=None, no_print=False): t = {"parameter": [], "typeOfLevel": [], "level": []} need_number = False for k, v in db.param_meta.items(): - if not v.md.get("number", None) in [["0"], [None]]: + if not v.md.get("number", None) in [[0], ["0"], [None]]: need_number = True break @@ -437,7 +437,7 @@ def describe(db, param=None, no_print=False): cnt += 1 for kk, md_v in v.md.items(): - if kk == "number" and md_v == ["0"]: + if kk == "number" and md_v == [0]: continue if not kk in ["shortName", "paramId"]: t["key"].append(labels.get(kk, kk)) diff --git a/tests/test_indexer.py b/tests/test_indexer.py index 396d9bb..7fc0cde 100644 --- a/tests/test_indexer.py +++ b/tests/test_indexer.py @@ -737,7 +737,7 @@ def test_param_info_from_fs_single_file(): "step": 0, "level": 700, "typeOfLevel": "isobaricInhPa", - "number": "0", + "number": 0, "experimentVersionNumber": "0001", "marsClass": "od", "marsStream": "oper", @@ -759,7 +759,7 @@ def test_param_info_from_fs_single_file(): "step": 0, "level": 500, "typeOfLevel": "isobaricInhPa", - "number": "0", + "number": 0, "experimentVersionNumber": "0001", "marsClass": "od", "marsStream": "oper", @@ -783,7 +783,7 @@ def test_param_info_from_fs_single_file(): "step": 0, "level": 500, "typeOfLevel": "isobaricInhPa", - "number": "0", + "number": 0, "experimentVersionNumber": "0001", "marsClass": "od", "marsStream": "oper", @@ -804,7 +804,7 @@ def test_param_info_from_fs_single_file(): "step": 0, "level": None, "typeOfLevel": "isobaricInhPa", - "number": "0", + "number": 0, "experimentVersionNumber": "0001", "marsClass": "od", "marsStream": "oper", @@ -827,7 +827,7 @@ def test_param_info_from_fs_single_file(): "step": 0, "level": 1000, "typeOfLevel": "isobaricInhPa", - "number": "0", + "number": 0, "experimentVersionNumber": "0001", "marsClass": "od", "marsStream": "oper", @@ -911,6 +911,31 @@ def test_indexer_dataframe_sort_value_with_key(): assert False +def test_indexer_dataframe_sort_ens(): + + md = { + "paramId": [5, 5, 5, 5], + "level": [925, 925, 925, 925], + "step": [12, 12, 12, 12], + "number": [1, 9, 10, 20], + } + + md_ref = { + "paramId": [5, 5, 5, 5], + "level": [925, 925, 925, 925], + "step": [12, 12, 12, 12], + "number": [1, 9, 10, 20], + } + + df = pd.DataFrame(md) + df = GribIndexer._sort_dataframe(df) + df_ref = pd.DataFrame(md_ref) + + if not df.equals(df_ref): + print(df.compare(df_ref)) + assert False + + def test_describe(): f = mv.read(file_in_testdir("tuv_pl.grib"))