def test_cfunits_conform(self): units_kelvin = get_units_object('kelvin') # Conversion of celsius units to kelvin. attrs = {k: 1 for k in NETCDF_ATTRIBUTES_TO_REMOVE_ON_VALUE_CHANGE} var = Variable(name='tas', units='celsius', value=self.value, attrs=attrs) self.assertEqual(len(var.attrs), 4) var.cfunits_conform(units_kelvin) self.assertNumpyAll(var.value, np.ma.array([278.15] * 3)) self.assertEqual(var.cfunits, units_kelvin) self.assertEqual(var.units, 'kelvin') self.assertEqual(len(var.attrs), 0) # If there are no units associated with a variable, conforming the units should fail. var = Variable(name='tas', units=None, value=self.value) with self.assertRaises(NoUnitsError): var.cfunits_conform(units_kelvin) # Conversion should fail for nonequivalent units. var = Variable(name='tas', units='kelvin', value=self.value) with self.assertRaises(ValueError): var.cfunits_conform(get_units_object('grams')) # The data type should always be updated to match the output from CF units backend. av = Variable(value=np.array([4, 5, 6]), dtype=int) self.assertEqual(av.dtype, np.dtype(int)) with self.assertRaises(NoUnitsError): av.cfunits_conform('K') av.units = 'celsius' av.cfunits_conform('K') self.assertIsNone(av._dtype) self.assertEqual(av.dtype, av.value.dtype)