例子
dataset.py/21 lines
with xr.open_dataset(self._path) as d:
self._lat = d[self._latname].data
self._lon = d[self._lonname].data
if self._hastime:
self._time = d[self._timename].data
self._time_d = (pd.DatetimeIndex(self._time) -
pd.datetime(1970, 1, 1)).days.values
vardim = np.setdiff1d(
d[self._varname].dims,
(self._latname, self._lonname, self._timename))
else:
self._time = None
self._time_d = None
vardim = np.setdiff1d(
d[self._varname].dims,
(self._latname, self._lonname))
if len(vardim) == 1:
self._vardim = vardim[0]
self._vardim_len = len(d[self._vardim])
elif len(vardim) == 0:
self._vardim = None
self._vardim_len = None
else:
raise ValueError(
'The variable dimensions do not match requirements.')
if self._hastimebin:
self._timebin = d[self._timebinname].data
self._timebin_d = np.array(
[(pd.DatetimeIndex(self._timebin[:, col]) - pd.datetime(1970, 1, 1)).days.values
for col in range(2)]).T
else:
self._timebin = None
self._timebin_d = None
def get_writeable(
self,
scale_factor: int = 1) -> 'SpatialData':
"""Get a writable version of the datasets.
Parameters
----------
scale_factor
The scale factor of the dataset that is used to rearrange the spatial dimension
of the dataset.
Returns
----------
A 'clean' version of the dataset.
"""
if scale_factor == 1:
var = self.var
else:
var = self._rescale(scale_factor)
if self._dtype is not None:
var = var.astype(self._dtype)
# Create dataset.
ds_new = xr.Dataset()
ds_new['data'] = var
# Put attributes back.
ds_new.attrs = self.ds.attrs
# If the dataset has a timebins, put them back.
if self.hastimebin:
ds_new[self.timebinname] = self.ds[self.timebinname]
if self.hastime:
ds_new = ds_new.rename({
self.timename: 'time'
})
if self.hastimebin:
ds_new = ds_new.rename({
self.timebinname: 'timebin'
})
# Some datasets store data with ascending latitude (-90, ..., 90). We stick
# to the convention of descending latitudes (90, ..., -90) as this puts
# north-west pixel at [0, 0] index of array when writing as zarr file.
if ds_new.lat[0].data < ds_new.lat[1].data:
ds_new = ds_new.reindex(lat=list(reversed(ds_new.lat)))
return ds_new