Skip to content

Commit 79e9729

Browse files
committed
FillValues: add unittests & small bug fix to make it work
1 parent 4536e37 commit 79e9729

2 files changed

Lines changed: 42 additions & 5 deletions

File tree

ncwriter/template.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -375,10 +375,10 @@ def createVariables(self, **kwargs):
375375
if dimensions is None: # no kwargs in createVariable
376376
ncvar = self.ncobj.createVariable(varname, datatype)
377377
else:
378-
var_c_keys = list(self._create_var_opts(var))
378+
var_attr = var.get('attributes', {})
379+
var_c_keys = list(self._create_var_opts(var_attr))
379380

380-
var_c_opts = dict(
381-
(x, var[x]) for x in var_c_keys)
381+
var_c_opts = {x: var_attr[x] for x in var_c_keys}
382382

383383
ureq_fillvalue = [
384384
x for x in cwargs.keys() if x in self.fill_aliases
@@ -391,11 +391,11 @@ def createVariables(self, **kwargs):
391391
var_c_opts.update(cwargs)
392392

393393
# user precendence
394-
if (ureq_fillvalue and vreq_fillvalue):
394+
if ureq_fillvalue and vreq_fillvalue:
395395
[var_c_opts.pop(x) for x in vreq_fillvalue]
396396
fv_val = [var_c_opts.pop(x) for x in ureq_fillvalue]
397397
var_c_opts['fill_value'] = fv_val[-1]
398-
elif (ureq_fillvalue and not vreq_fillvalue):
398+
elif ureq_fillvalue and not vreq_fillvalue:
399399
fv_val = [var_c_opts.pop(x) for x in ureq_fillvalue]
400400
var_c_opts['fill_value'] = fv_val[-1]
401401
else:

test_ncwriter/test_template.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,43 @@ def test_create_file(self):
173173
ds_global_attributes = OrderedDict((k, dataset.getncattr(k)) for k in dataset.ncattrs())
174174
self.assertEqual(self.global_attributes, ds_global_attributes)
175175

176+
def test_fill_values(self):
177+
template = DatasetTemplate(dimensions={'X': 10})
178+
template.variables['X'] = {'dimensions': ['X'],
179+
'type': 'float32',
180+
'attributes': {'_FillValue': -999.}
181+
}
182+
x = np.array([-999., -999., -999., -999., -999., 1., 2., 3., 4., 5])
183+
template.variables['X']['values'] = x
184+
template.to_netcdf(self.temp_nc_file)
185+
186+
dataset = Dataset(self.temp_nc_file)
187+
dsx = dataset.variables['X']
188+
self.assertEqual(-999., dsx._FillValue)
189+
self.assertIsInstance(dsx[:], np.ma.MaskedArray)
190+
self.assertTrue(dsx[:5].mask.all())
191+
self.assertTrue((dsx[5:] == x[5:]).all())
192+
193+
def test_fill_values_from_masked_array(self):
194+
template = DatasetTemplate(dimensions={'X': 10})
195+
template.variables['X'] = {'dimensions': ['X'],
196+
'type': 'float32',
197+
'attributes': {'_FillValue': -999.}
198+
}
199+
x = np.array([-4, -3, -2, -1, 0, 1., 2., 3., 4., 5])
200+
template.variables['X']['values'] = np.ma.masked_array(x,
201+
mask=[True, True, True, True, True,
202+
False, False, False, False, False]
203+
)
204+
template.to_netcdf(self.temp_nc_file)
205+
206+
dataset = Dataset(self.temp_nc_file)
207+
dsx = dataset.variables['X']
208+
self.assertEqual(-999., dsx._FillValue)
209+
self.assertIsInstance(dsx[:], np.ma.MaskedArray)
210+
self.assertTrue(dsx[:5].mask.all())
211+
self.assertTrue((dsx[5:] == x[5:]).all())
212+
176213
# TODO: add data from multiple numpy arrays
177214
# e.g. template.add_data(TIME=time_values, TEMP=temp_values, PRES=pres_values)
178215
# TODO: add data from Pandas dataframe (later...)

0 commit comments

Comments
 (0)