class TestDataValues(TemplateTestCase): def setUp(self): super(TestDataValues, self).setUp() self.data_array = np.array([-999., -999., -999., -999., -999., 1., 2., 3., 4., 5]) self.data_masked = np.ma.masked_array([-4, -3, -2, -1, 0, 1., 2., 3., 4., 5], mask=[True, True, True, True, True, False, False, False, False, False]) self.template = DatasetTemplate( dimensions={'TIME': 10}, variables={ 'TIME': { '_dimensions': ['TIME'], '_datatype': 'float32', '_data': np.array([np.nan, np.nan, 1, 2, 3, 4, 5, 6, 7, 8]) }, 'X': { '_dimensions': ['TIME'], '_datatype': 'float32', '_FillValue': -999., '_data': self.data_array }, 'Y': { '_dimensions': ['TIME'], '_datatype': 'float32', '_fill_value': -999., '_data': self.data_masked } } ) def test_fill_values(self): self.template.to_netcdf(self.temp_nc_file) dataset = Dataset(self.temp_nc_file) dataset.set_auto_mask(True) for varname in ('X', 'Y'): dsvar = dataset.variables[varname] self.assertEqual(-999., dsvar._FillValue) self.assertIsInstance(dsvar[:], np.ma.MaskedArray) self.assertTrue(dsvar[:5].mask.all()) self.assertTrue((dsvar[5:] == self.data_array[5:]).all()) def test_fill_value_aliases(self): self.template.variables['X']['_fill_value'] = -999. # both aliases, but equal so should still work self.template.to_netcdf(self.temp_nc_file) dataset = Dataset(self.temp_nc_file) self.assertEqual(-999., dataset.variables['X']._FillValue) del self._temp_nc_file self.template.variables['X']['_fill_value'] = -666. # now they're different, which is an error self.assertRaises(ValueError, self.template.to_netcdf, self.temp_nc_file) def test_get_data_range(self): self.assertEqual((1, 8), self.template.get_data_range('TIME')) self.assertEqual((1, 5), self.template.get_data_range('X')) self.assertEqual((1, 5), self.template.get_data_range('Y'))
class TestDataValues(TemplateTestCase): def setUp(self): super(TestDataValues, self).setUp() self.data_array = np.array( [-999., -999., -999., -999., -999., 1., 2., 3., 4., 5]) self.data_masked = np.ma.masked_array( [-4, -3, -2, -1, 0, 1., 2., 3., 4., 5], mask=[ True, True, True, True, True, False, False, False, False, False ]) self.template = DatasetTemplate( dimensions={'TIME': 10}, variables={ 'TIME': { '_dimensions': ['TIME'], '_datatype': 'float64', 'valid_min': 0, 'valid_max': 10, '_data': np.array([np.nan, np.nan, 1, 2, 3, 4, 5, 6, 7, 8]) }, 'X': { '_dimensions': ['TIME'], '_datatype': 'float32', 'valid_min': 1, 'valid_max': 5, '_FillValue': -999, '_data': self.data_array }, 'Y': { '_dimensions': ['TIME'], '_datatype': 'float32', 'valid_range': [-4, 5], '_fill_value': -999, '_data': self.data_masked }, 'N': { '_dimensions': ['TIME'], '_datatype': 'int32', 'valid_range': [-4, 5], '_fill_value': -999, '_data': self.data_array } }) def test_fill_values(self): self.template.to_netcdf(self.temp_nc_file) dataset = Dataset(self.temp_nc_file) dataset.set_auto_mask(True) for varname in ('X', 'Y'): dsvar = dataset.variables[varname] self.assertEqual(-999., dsvar._FillValue) self.assertIsInstance(dsvar[:], np.ma.MaskedArray) self.assertTrue(dsvar[:5].mask.all()) self.assertTrue((dsvar[5:] == self.data_array[5:]).all()) def test_fill_value_aliases(self): self.template.variables['X'][ '_fill_value'] = -999. # both aliases, but equal so should still work self.template.to_netcdf(self.temp_nc_file) dataset = Dataset(self.temp_nc_file) self.assertEqual(-999., dataset.variables['X']._FillValue) del self._temp_nc_file self.template.variables['X'][ '_fill_value'] = -666. # now they're different, which is an error self.assertRaises(ValueError, self.template.to_netcdf, self.temp_nc_file) def test_get_data_range(self): self.assertEqual((1, 8), self.template.get_data_range('TIME')) self.assertEqual((1, 5), self.template.get_data_range('X')) self.assertEqual((1, 5), self.template.get_data_range('Y')) def test_var_attr_datatype_conversion(self): """ test to check the conversion of some attributes matches the datatype of the variable as defined in the template """ self.template.to_netcdf(self.temp_nc_file) dataset = Dataset(self.temp_nc_file) TIME = dataset.variables['TIME'] self.assertEqual(TIME.dtype, TIME.valid_min.dtype) self.assertEqual(TIME.dtype, TIME.valid_max.dtype) X = dataset.variables['X'] self.assertEqual(X.dtype, X.valid_min.dtype) self.assertEqual(X.dtype, X.valid_max.dtype) self.assertEqual(X.dtype, X._FillValue.dtype) for v in ['Y', 'N']: var = dataset.variables[v] self.assertEqual(var.dtype, var.valid_range.dtype) self.assertEqual(var.dtype, var._FillValue.dtype)