Exemplo n.º 1
0
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")
Exemplo n.º 2
0
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
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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
Exemplo n.º 11
0
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