def test_unsupported_args(dset): with pytest.raises(ValueError): esmlab.resample(dset, freq='hr') with pytest.raises(ValueError): esmlab.climatology(dset, freq='hr') with pytest.raises(ValueError): esmlab.anomaly(dset, clim_freq='ann')
def test_mon_climatology_drop_time_bounds(ds_name, decoded, variables, time_coord_name, time_bound_name): ds = esmlab.datasets.open_dataset(ds_name, decode_times=decoded) ds_time_bound = ds[time_coord_name].attrs[time_bound_name] ds = ds.drop(ds_time_bound) del ds[time_coord_name].attrs[time_bound_name] esm = ds.esmlab.set_time(time_coord_name=time_coord_name) computed_dset = esmlab.climatology(ds, freq='mon') esmlab_res = computed_dset.drop(esm.static_variables).to_dataframe() esmlab_res = esmlab_res.groupby('month').mean()[variables] df = (esm._ds_time_computed.drop( esm.static_variables).to_dataframe().reset_index( level=[esm.time_coord_name])) df[esm.time_coord_name] = df[esm.time_coord_name].values.astype( 'datetime64[ns]') pd_res = df.groupby(df[esm.time_coord_name].dt.month).mean() pd_res.index.name = 'month' pd_res = pd_res[variables] assert_both_frames_equal(esmlab_res, pd_res) assert computed_dset[esm.time_coord_name].dtype == ds[ esm.time_coord_name].dtype for key, value in ds[esm.time_coord_name].attrs.items(): assert key in computed_dset[esm.time_coord_name].attrs assert value == computed_dset[esm.time_coord_name].attrs[key]
def test_mon_climatology(ds_name, decoded, variables, time_coord_name): ds = esmlab.datasets.open_dataset(ds_name, decode_times=decoded) esm = ds.esmlab.set_time(time_coord_name=time_coord_name) xr.testing._assert_internal_invariants(esm._ds_time_computed) computed_dset = esmlab.climatology(ds, freq='mon') esmlab_res = computed_dset.to_dataframe() esmlab_res = esmlab_res.groupby('month').mean()[variables] df = (esm._ds_time_computed.drop( esm.static_variables).to_dataframe().reset_index( level=[esm.time_coord_name])) df[esm.time_coord_name] = df[esm.time_coord_name].values.astype( 'datetime64[ns]') pd_res = df.groupby(df[esm.time_coord_name].dt.month).mean() pd_res.index.name = 'month' pd_res = pd_res[variables] assert_both_frames_equal(esmlab_res, pd_res)
def compute_clim_mon(ds_in, yr_lo, yr_hi, time_name='time'): """compute and return monthly climatology""" yyyymmdd_lo = yr_lo + '-01-01' yyyymmdd_hi = yr_hi + '-12-31' ds_clim = esmlab.climatology( ds_in.sel(time=slice(yyyymmdd_lo, yyyymmdd_hi)), freq='mon') # set essential time encoding values from ds_in # as esmlab.climatology only sets dtype and _FillValue for attr_name in ['units', 'calendar']: ds_clim[time_name].encoding[attr_name] = ds_in[time_name].encoding[ attr_name] # copy global attributes from ds_in ds_clim.attrs.update(ds_in.attrs) return ds_clim