def test_sel_time(): time_bounds = np.array([[0, 31], [31, 59], [59, 90]]) nv = np.array([0, 1]) time = np.array([15, 46, 74]) data = np.zeros((3)) var_name = 'a' ds = xr.DataArray(data, coords=[time], dims=[TIME_STR], name=var_name).to_dataset() ds[TIME_BOUNDS_STR] = xr.DataArray(time_bounds, coords=[time, nv], dims=[TIME_STR, BOUNDS_STR], name=TIME_BOUNDS_STR) units_str = 'days since 2000-01-01 00:00:00' ds[TIME_STR].attrs['units'] = units_str ds = ensure_time_avg_has_cf_metadata(ds) ds = set_grid_attrs_as_coords(ds) ds = xr.decode_cf(ds) da = ds[var_name] start_date = np.datetime64('2000-02-01') end_date = np.datetime64('2000-03-31') result = sel_time(da, start_date, end_date) assert result[SUBSET_START_DATE_STR].values == start_date assert result[SUBSET_END_DATE_STR].values == end_date
def test_assert_has_data_for_time(): time_bounds = np.array([[0, 31], [31, 59], [59, 90]]) nv = np.array([0, 1]) time = np.array([15, 46, 74]) data = np.zeros((3)) var_name = 'a' ds = xr.DataArray(data, coords=[time], dims=[TIME_STR], name=var_name).to_dataset() ds[TIME_BOUNDS_STR] = xr.DataArray(time_bounds, coords=[time, nv], dims=[TIME_STR, BOUNDS_STR], name=TIME_BOUNDS_STR) units_str = 'days since 2000-01-01 00:00:00' ds[TIME_STR].attrs['units'] = units_str ds = ensure_time_avg_has_cf_metadata(ds) ds = set_grid_attrs_as_coords(ds) ds = xr.decode_cf(ds) da = ds[var_name] start_date = np.datetime64('2000-01-01') end_date = np.datetime64('2000-03-31') _assert_has_data_for_time(da, start_date, end_date) start_date_bad = np.datetime64('1999-12-31') end_date_bad = np.datetime64('2000-04-01') with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date_bad, end_date) with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date, end_date_bad) with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date_bad, end_date_bad)
def test_assert_has_data_for_time_str_input(): time_bounds = np.array([[0, 31], [31, 59], [59, 90]]) nv = np.array([0, 1]) time = np.array([15, 46, 74]) data = np.zeros((3)) var_name = 'a' ds = xr.DataArray(data, coords=[time], dims=[TIME_STR], name=var_name).to_dataset() ds[TIME_BOUNDS_STR] = xr.DataArray(time_bounds, coords=[time, nv], dims=[TIME_STR, BOUNDS_STR], name=TIME_BOUNDS_STR) units_str = 'days since 2000-01-01 00:00:00' ds[TIME_STR].attrs['units'] = units_str ds = ensure_time_avg_has_cf_metadata(ds) ds = set_grid_attrs_as_coords(ds) ds = xr.decode_cf(ds) da = ds[var_name] start_date = '2000-01-01' end_date = '2000-03-31' _assert_has_data_for_time(da, start_date, end_date) start_date_bad = '1999-12-31' end_date_bad = '2000-04-01' # With strings these checks are disabled _assert_has_data_for_time(da, start_date_bad, end_date) _assert_has_data_for_time(da, start_date, end_date_bad) _assert_has_data_for_time(da, start_date_bad, end_date_bad)
def test_assert_has_data_for_time_str_input(): time_bounds = np.array([[0, 31], [31, 59], [59, 90]]) nv = np.array([0, 1]) time = np.array([15, 46, 74]) data = np.zeros((3)) var_name = 'a' ds = xr.DataArray(data, coords=[time], dims=[TIME_STR], name=var_name).to_dataset() ds[TIME_BOUNDS_STR] = xr.DataArray(time_bounds, coords=[time, nv], dims=[TIME_STR, BOUNDS_STR], name=TIME_BOUNDS_STR) units_str = 'days since 2000-01-01 00:00:00' ds[TIME_STR].attrs['units'] = units_str ds = ensure_time_avg_has_cf_metadata(ds) ds = set_grid_attrs_as_coords(ds) ds = xr.decode_cf(ds) da = ds[var_name] start_date = '2000-01-01' end_date = '2000-03-31' _assert_has_data_for_time(da, start_date, end_date) start_date_bad = '1999-12-31' end_date_bad = '2000-04-01' # With strings these checks are disabled _assert_has_data_for_time(da, start_date_bad, end_date) _assert_has_data_for_time(da, start_date, end_date_bad) _assert_has_data_for_time(da, start_date_bad, end_date_bad)
def test_assert_has_data_for_time_cftime_datetimes(calendar, date_type): time_bounds = np.array([[0, 2], [2, 4], [4, 6]]) nv = np.array([0, 1]) time = np.array([1, 3, 5]) data = np.zeros((3)) var_name = 'a' ds = xr.DataArray(data, coords=[time], dims=[TIME_STR], name=var_name).to_dataset() ds[TIME_BOUNDS_STR] = xr.DataArray(time_bounds, coords=[time, nv], dims=[TIME_STR, BOUNDS_STR], name=TIME_BOUNDS_STR) units_str = 'days since 0002-01-02 00:00:00' ds[TIME_STR].attrs['units'] = units_str ds[TIME_STR].attrs['calendar'] = calendar ds = ensure_time_avg_has_cf_metadata(ds) ds = set_grid_attrs_as_coords(ds) with warnings.catch_warnings(record=True): with xr.set_options(enable_cftimeindex=True): ds = xr.decode_cf(ds) da = ds[var_name] start_date = date_type(2, 1, 2) end_date = date_type(2, 1, 8) _assert_has_data_for_time(da, start_date, end_date) start_date_bad = date_type(2, 1, 1) end_date_bad = date_type(2, 1, 9) with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date_bad, end_date) with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date, end_date_bad) with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date_bad, end_date_bad)
def test_assert_has_data_for_time_cftime_datetimes(calendar, date_type): time_bounds = np.array([[0, 2], [2, 4], [4, 6]]) nv = np.array([0, 1]) time = np.array([1, 3, 5]) data = np.zeros((3)) var_name = 'a' ds = xr.DataArray(data, coords=[time], dims=[TIME_STR], name=var_name).to_dataset() ds[TIME_BOUNDS_STR] = xr.DataArray(time_bounds, coords=[time, nv], dims=[TIME_STR, BOUNDS_STR], name=TIME_BOUNDS_STR) units_str = 'days since 0002-01-02 00:00:00' ds[TIME_STR].attrs['units'] = units_str ds[TIME_STR].attrs['calendar'] = calendar ds = ensure_time_avg_has_cf_metadata(ds) ds = set_grid_attrs_as_coords(ds) with warnings.catch_warnings(record=True): with xr.set_options(enable_cftimeindex=True): ds = xr.decode_cf(ds) da = ds[var_name] start_date = date_type(2, 1, 2) end_date = date_type(2, 1, 8) _assert_has_data_for_time(da, start_date, end_date) start_date_bad = date_type(2, 1, 1) end_date_bad = date_type(2, 1, 9) with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date_bad, end_date) with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date, end_date_bad) with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date_bad, end_date_bad)
def test_sel_time(): time_bounds = np.array([[0, 31], [31, 59], [59, 90]]) nv = np.array([0, 1]) time = np.array([15, 46, 74]) data = np.zeros((3)) var_name = 'a' ds = xr.DataArray(data, coords=[time], dims=[TIME_STR], name=var_name).to_dataset() ds[TIME_BOUNDS_STR] = xr.DataArray(time_bounds, coords=[time, nv], dims=[TIME_STR, BOUNDS_STR], name=TIME_BOUNDS_STR) units_str = 'days since 2000-01-01 00:00:00' ds[TIME_STR].attrs['units'] = units_str ds = ensure_time_avg_has_cf_metadata(ds) ds = set_grid_attrs_as_coords(ds) ds = xr.decode_cf(ds) da = ds[var_name] start_date = np.datetime64('2000-02-01') end_date = np.datetime64('2000-03-31') result = sel_time(da, start_date, end_date) assert result[SUBSET_START_DATE_STR].values == start_date assert result[SUBSET_END_DATE_STR].values == end_date
def test_ensure_time_avg_has_cf_metadata(ds_time_encoded_cf): ds = ds_time_encoded_cf time = ds[TIME_STR].values time_bounds = ds[TIME_BOUNDS_STR].values units_str = ds[TIME_STR].attrs['units'] cal_str = ds[TIME_STR].attrs['calendar'] with pytest.raises(KeyError): ds[TIME_BOUNDS_STR].attrs['units'] with pytest.raises(KeyError): ds[TIME_BOUNDS_STR].attrs['calendar'] ds = ensure_time_avg_has_cf_metadata(ds) result = ds[TIME_BOUNDS_STR].attrs['units'] assert result == units_str result = ds[TIME_BOUNDS_STR].attrs['calendar'] assert result == cal_str avg_DT_data = np.diff(time_bounds, axis=1).squeeze() average_DT_expected = xr.DataArray(avg_DT_data, coords=[time], dims=[TIME_STR], name=TIME_WEIGHTS_STR) average_DT_expected[TIME_STR].attrs['units'] = units_str average_DT_expected.attrs['units'] = 'days' average_DT_expected[TIME_STR].attrs['calendar'] = cal_str assert ds[TIME_WEIGHTS_STR].identical(average_DT_expected) assert ds[RAW_START_DATE_STR].values == [0] assert ds[RAW_START_DATE_STR].attrs['units'] == units_str assert ds[RAW_START_DATE_STR].attrs['calendar'] == cal_str assert ds[RAW_END_DATE_STR].values == [90] assert ds[RAW_END_DATE_STR].attrs['units'] == units_str assert ds[RAW_END_DATE_STR].attrs['calendar'] == cal_str
def test_assert_has_data_for_time(): time_bounds = np.array([[0, 31], [31, 59], [59, 90]]) nv = np.array([0, 1]) time = np.array([15, 46, 74]) data = np.zeros((3)) var_name = 'a' ds = xr.DataArray(data, coords=[time], dims=[TIME_STR], name=var_name).to_dataset() ds[TIME_BOUNDS_STR] = xr.DataArray(time_bounds, coords=[time, nv], dims=[TIME_STR, BOUNDS_STR], name=TIME_BOUNDS_STR) units_str = 'days since 2000-01-01 00:00:00' ds[TIME_STR].attrs['units'] = units_str ds = ensure_time_avg_has_cf_metadata(ds) ds = set_grid_attrs_as_coords(ds) ds = xr.decode_cf(ds) da = ds[var_name] start_date = np.datetime64('2000-01-01') end_date = np.datetime64('2000-03-31') _assert_has_data_for_time(da, start_date, end_date) start_date_bad = np.datetime64('1999-12-31') end_date_bad = np.datetime64('2000-04-01') with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date_bad, end_date) with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date, end_date_bad) with pytest.raises(AssertionError): _assert_has_data_for_time(da, start_date_bad, end_date_bad)
def test_ensure_time_avg_has_cf_metadata(ds_time_encoded_cf): ds = ds_time_encoded_cf time = ds[TIME_STR].values time_bounds = ds[TIME_BOUNDS_STR].values units_str = ds[TIME_STR].attrs['units'] cal_str = ds[TIME_STR].attrs['calendar'] with pytest.raises(KeyError): ds[TIME_BOUNDS_STR].attrs['units'] with pytest.raises(KeyError): ds[TIME_BOUNDS_STR].attrs['calendar'] ds = ensure_time_avg_has_cf_metadata(ds) result = ds[TIME_BOUNDS_STR].attrs['units'] assert result == units_str result = ds[TIME_BOUNDS_STR].attrs['calendar'] assert result == cal_str avg_DT_data = np.diff(time_bounds, axis=1).squeeze() average_DT_expected = xr.DataArray(avg_DT_data, coords=[time], dims=[TIME_STR], name=TIME_WEIGHTS_STR) average_DT_expected[TIME_STR].attrs['units'] = units_str average_DT_expected.attrs['units'] = 'days' average_DT_expected[TIME_STR].attrs['calendar'] = cal_str assert ds[TIME_WEIGHTS_STR].identical(average_DT_expected) assert ds[RAW_START_DATE_STR].values == [0] assert ds[RAW_START_DATE_STR].attrs['units'] == units_str assert ds[RAW_START_DATE_STR].attrs['calendar'] == cal_str assert ds[RAW_END_DATE_STR].values == [90] assert ds[RAW_END_DATE_STR].attrs['units'] == units_str assert ds[RAW_END_DATE_STR].attrs['calendar'] == cal_str