def test_encode_expected_failures(): dates = pd.date_range("2000", periods=3) with pytest.raises(ValueError, match="invalid time units"): encode_cf_datetime(dates, units="days after 2000-01-01") with pytest.raises(ValueError, match="invalid reference date"): encode_cf_datetime(dates, units="days since NO_YEAR")
def test_time_units_with_timezone_roundtrip(calendar): # Regression test for GH 2649 expected_units = "days since 2000-01-01T00:00:00-05:00" expected_num_dates = np.array([1, 2, 3]) dates = decode_cf_datetime(expected_num_dates, expected_units, calendar) # Check that dates were decoded to UTC; here the hours should all # equal 5. result_hours = DataArray(dates).dt.hour expected_hours = DataArray([5, 5, 5]) assert_equal(result_hours, expected_hours) # Check that the encoded values are accurately roundtripped. result_num_dates, result_units, result_calendar = encode_cf_datetime( dates, expected_units, calendar ) if calendar in _STANDARD_CALENDARS: np.testing.assert_array_equal(result_num_dates, expected_num_dates) else: # cftime datetime arithmetic is not quite exact. np.testing.assert_allclose(result_num_dates, expected_num_dates) assert result_units == expected_units assert result_calendar == calendar
def _update_file(self, nc, row): """Update metadata of a single file.""" for add_mda in ADDITIONAL_METADATA: add_mda = add_mda.copy() var_name = add_mda.pop("name") fill_value = add_mda.pop("fill_value") data = row[var_name] # Create nc variable nc_var = self._create_nc_var( nc=nc, var_name=var_name, fill_value=fill_value, dtype=add_mda.pop("dtype"), dims=data.dims, shape=data.shape, ) # Write data to nc variable. Since netCDF4 cannot handle NaN nor NaT, disable # auto-masking, and set null-data to fill value manually. nc_var.set_auto_mask(False) if np.issubdtype(data.dtype, np.datetime64): data, _, _ = encode_cf_datetime(data, units=add_mda["units"], calendar=add_mda["calendar"]) data = np.nan_to_num(data, nan=fill_value) else: data = data.fillna(fill_value).values nc_var[:] = data # Set attributes of nc variable for key, val in add_mda.items(): nc_var.setncattr(key, val)
def test_encode_cf_datetime_overflow(shape): # Test for fix to GH 2272 dates = pd.date_range("2100", periods=24).values.reshape(shape) units = "days since 1800-01-01" calendar = "standard" num, _, _ = encode_cf_datetime(dates, units, calendar) roundtrip = decode_cf_datetime(num, units, calendar) np.testing.assert_array_equal(dates, roundtrip)
def test_encode_cf_datetime_overflow(shape): # Test for fix to GH 2272 dates = pd.date_range('2100', periods=24).values.reshape(shape) units = 'days since 1800-01-01' calendar = 'standard' num, _, _ = encode_cf_datetime(dates, units, calendar) roundtrip = decode_cf_datetime(num, units, calendar) np.testing.assert_array_equal(dates, roundtrip)
def test_encode_cf_datetime_pandas_min(): # GH 2623 dates = pd.date_range("2000", periods=3) num, units, calendar = encode_cf_datetime(dates) expected_num = np.array([0.0, 1.0, 2.0]) expected_units = "days since 2000-01-01 00:00:00" expected_calendar = "proleptic_gregorian" np.testing.assert_array_equal(num, expected_num) assert units == expected_units assert calendar == expected_calendar
def test_encode_cf_datetime_pandas_min(): # Test that encode_cf_datetime does not fail for versions # of pandas < 0.21.1 (GH 2623). dates = pd.date_range('2000', periods=3) num, units, calendar = encode_cf_datetime(dates) expected_num = np.array([0., 1., 2.]) expected_units = 'days since 2000-01-01 00:00:00' expected_calendar = 'proleptic_gregorian' np.testing.assert_array_equal(num, expected_num) assert units == expected_units assert calendar == expected_calendar
def test_encode_cf_datetime_units_with_tz(): # Regression test for GH 2649 units = 'days since 2000-01-01T00:00:00-05:00' calendar = 'proleptic_gregorian' dates = pd.date_range('2000', periods=3, tz='US/Eastern').values num, units, calendar = encode_cf_datetime(dates, units=units, calendar=calendar) expected_num = np.array([0, 1, 2]) expected_units = 'days since 2000-01-01T00:00:00-05:00' expected_calendar = 'proleptic_gregorian' np.testing.assert_array_equal(num, expected_num) assert units == expected_units assert calendar == expected_calendar
def test_encode_cf_datetime_invalid_pandas_valid_cftime() -> None: num, units, calendar = encode_cf_datetime( pd.date_range("2000", periods=3), # Pandas fails to parse this unit, but cftime is quite happy with it "days since 1970-01-01 00:00:00 00", "standard", ) expected_num = [10957, 10958, 10959] expected_units = "days since 1970-01-01 00:00:00 00" expected_calendar = "standard" assert_array_equal(num, expected_num) assert units == expected_units assert calendar == expected_calendar
def test_time_units_with_timezone_roundtrip(calendar): # Regression test for GH 2649 expected_units = 'days since 2000-01-01T00:00:00-05:00' expected_num_dates = np.array([1, 2, 3]) dates = decode_cf_datetime(expected_num_dates, expected_units, calendar) # Check that dates were decoded to UTC; here the hours should all # equal 5. result_hours = DataArray(dates).dt.hour expected_hours = DataArray([5, 5, 5]) assert_equal(result_hours, expected_hours) # Check that the encoded values are accurately roundtripped. result_num_dates, result_units, result_calendar = encode_cf_datetime( dates, expected_units, calendar) if calendar in _STANDARD_CALENDARS: np.testing.assert_array_equal(result_num_dates, expected_num_dates) else: # cftime datetime arithmetic is not quite exact. np.testing.assert_allclose(result_num_dates, expected_num_dates) assert result_units == expected_units assert result_calendar == calendar