Exemplo n.º 1
0
def _set_default_time_encoding(encoding, dataset):
    """Set default time encoding.

    Make sure time coordinates and bounds have the same units. Default is xarray's CF datetime
    encoding, which can be overridden by user-defined encoding.
    """
    if 'time' in dataset:
        try:
            dtnp64 = dataset['time'].data[0]
        except IndexError:
            dtnp64 = dataset['time'].data

        default = CFDatetimeCoder().encode(xr.DataArray(dtnp64))
        time_enc = {
            'units': default.attrs['units'],
            'calendar': default.attrs['calendar']
        }
        time_enc.update(encoding.get('time', {}))
        bounds_enc = {
            'units': time_enc['units'],
            'calendar': time_enc['calendar'],
            '_FillValue': None
        }
        encoding['time'] = time_enc
        encoding[
            'time_bnds'] = bounds_enc  # FUTURE: Not required anymore with xarray-0.14+
Exemplo n.º 2
0
    def update_encoding(self, dataset, to_netcdf_kwargs):
        """Update encoding.

        Avoid _FillValue attribute being added to coordinate variables (https://github.com/pydata/xarray/issues/1865).
        """
        other_to_netcdf_kwargs = to_netcdf_kwargs.copy()
        encoding = other_to_netcdf_kwargs.pop('encoding', {}).copy()
        coord_vars = []
        for data_array in dataset.values():
            coord_vars.extend(set(data_array.dims).intersection(data_array.coords))
        for coord_var in coord_vars:
            encoding.setdefault(coord_var, {})
            encoding[coord_var].update({'_FillValue': None})

        # Make sure time coordinates and bounds have the same units. Default is xarray's CF datetime
        # encoding, which can be overridden by user-defined encoding.
        if 'time' in dataset:
            try:
                dtnp64 = dataset['time'].data[0]
            except IndexError:
                dtnp64 = dataset['time'].data

            default = CFDatetimeCoder().encode(xr.DataArray(dtnp64))
            time_enc = {'units': default.attrs['units'], 'calendar': default.attrs['calendar']}
            time_enc.update(encoding.get('time', {}))
            bounds_enc = {'units': time_enc['units'],
                          'calendar': time_enc['calendar'],
                          '_FillValue': None}
            encoding['time'] = time_enc
            encoding['time_bnds'] = bounds_enc  # FUTURE: Not required anymore with xarray-0.14+

        return encoding, other_to_netcdf_kwargs