Skip to content

Commit 0cb00d0

Browse files
huardpre-commit-ci[bot]Copilot
authored
Fix 78 (#80)
* add test for dimension renaming. Fails. * added function to rename dimensions * black * complete test * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update xncml/parser.py Co-authored-by: Copilot <[email protected]> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Copilot <[email protected]>
1 parent 89a6997 commit 0cb00d0

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

tests/data/modifyDim.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2" location="nc/example.nc">
3+
4+
<dimension name="newTime" orgName="time"/>
5+
6+
<variable name="time" shape="newTime"/>
7+
<variable name="rh" shape="newTime lat lon"/>
8+
<variable name="T" shape="newTime lat lon"/>
9+
</netcdf>

tests/test_parser.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,15 @@ def test_agg_syn_rename():
192192
assert 'Temperature' in ds
193193

194194

195+
def test_rename_dim():
196+
ds = xncml.open_ncml(data / 'modifyDim.xml')
197+
assert 'newTime' in ds.dims
198+
assert 'time' not in ds.dims
199+
assert len(ds['newTime']) == 4
200+
assert ds['time'].dims == ('newTime',)
201+
assert ds['T'].dims == ('newTime', 'lat', 'lon')
202+
203+
195204
def test_rename_var():
196205
ds = xncml.open_ncml(data / 'renameVar.xml')
197206
assert ds.attrs['title'] == 'Example Data'

xncml/parser.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,8 @@ def read_group(
314314
enums = {} if enums is None else enums
315315
for item in obj.choice:
316316
if isinstance(item, Dimension):
317+
target = rename_dimension(target, ref, item)
318+
317319
dim_name = item.name
318320
if dims.get(dim_name):
319321
dims[dim_name].append(read_dimension(item))
@@ -541,7 +543,7 @@ def read_variable(
541543
elif obj.shape == '':
542544
out = build_scalar_variable(var_name=var_name, values_tag=obj.values, var_type=obj.type)
543545
else:
544-
error_msg = f'Could not build variable `{var_name }`.'
546+
error_msg = f'Could not build variable `{var_name}`.'
545547
raise ValueError(error_msg)
546548

547549
# Set variable attributes
@@ -744,6 +746,20 @@ def read_dimension(obj: Dimension) -> Dimension:
744746
return obj
745747

746748

749+
def rename_dimension(target: xr.Dataset, ref: xr.Dataset, obj: Dimension) -> xr.Dataset:
750+
"""Rename dimension in target dataset."""
751+
if obj.org_name:
752+
if obj.org_name in target.dims:
753+
target = target.rename_dims({obj.org_name: obj.name})
754+
elif obj.org_name in ref.dims:
755+
target = target.expand_dims({obj.name: ref.dims[obj.org_name]})
756+
else:
757+
raise ValueError(
758+
f"Dimension '{obj.org_name}' not found in either the target or reference dataset."
759+
)
760+
return target
761+
762+
747763
def nctype(typ: DataType) -> type:
748764
"""Return Python type corresponding to the NcML DataType of object."""
749765

0 commit comments

Comments
 (0)