diff --git a/kerchunk/netCDF3.py b/kerchunk/netCDF3.py index a3b0c58f..200159d1 100644 --- a/kerchunk/netCDF3.py +++ b/kerchunk/netCDF3.py @@ -207,9 +207,15 @@ def translate(self): outer_shape = size // dt.itemsize offset = start for name in dt.names: + dtype = dt[name] + + # Skip padding, but increment offset. + if name.startswith("_padding_"): + offset += dtype.itemsize + continue + # the order of the names if fixed and important! var = self.variables[name] - dtype = dt[name] base = dtype.base # actual dtype shape = (outer_shape,) + dtype.shape diff --git a/kerchunk/tests/test_netcdf.py b/kerchunk/tests/test_netcdf.py index 8df0d919..baca317a 100644 --- a/kerchunk/tests/test_netcdf.py +++ b/kerchunk/tests/test_netcdf.py @@ -45,6 +45,11 @@ def unlimited_dataset(tmpdir): rootgrp.createDimension("lat", 10) rootgrp.createDimension("lon", 5) rootgrp.createVariable("time", "f8", ("time",)) + # reference time is an unbounded dimension that is a half byte long, so it + # has padding to line up to take up exactly one byte. It is here to test that + # kerchunk can handle the padding correctly and read following variables + # correctly. + rootgrp.createVariable("reference_time", "h", ("time",)) rootgrp.title = "testing" latitudes = rootgrp.createVariable("lat", "f4", ("lat",)) longitudes = rootgrp.createVariable("lon", "f4", ("lon",))