コード例 #1
0
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'))
コード例 #2
0
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)