नेटसीडीएफ फ़ाइल जिसे मैं xarray में पढ़ रहा हूँ, दुर्भाग्य से उस समय निर्देशांक में कैलेंडर विशेषता है जिसे CF-मानक proleptic_gregorian के बजाय gregorian_proleptic के रूप में निर्दिष्ट किया गया है।

मैं इसे कैसे ठीक करूं?

मैंने केवल विशेषता को बदलने की कोशिश की, लेकिन xarray में वह मेटाडेटा पहले से ही कहीं और जमा होना चाहिए जिसे मुझे संशोधित करने की आवश्यकता है क्योंकि जब मैं decode_cf का उपयोग करने का प्रयास करता हूं, तब भी यह सोचता है कि कैलेंडर gregorian_proleptic है। मैंने जो कोशिश की है वह यहां है:

import xarray as xr
import fsspec

url='s3://noaa-ofs-pds/dbofs.20200826/nos.dbofs.fields.f044.20200826.t06z.nc'
ncfile = fsspec.open(url)
ds = xr.open_dataset(ncfile.open(), decode_times=False)

ds.ocean_time.attrs['calendar']='proleptic_gregorian'

xr.decode_cf(ds, decode_times=True)

जो उत्पादन करता है:

---------------------------------------------------------------------------
OutOfBoundsDatetime                       Traceback (most recent call last)
/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in decode_cf_datetime(num_dates, units, calendar, use_cftime)
    157         try:
--> 158             dates = _decode_datetime_with_pandas(flat_num_dates, units, calendar)
    159         except (KeyError, OutOfBoundsDatetime, OverflowError):

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in _decode_datetime_with_pandas(flat_num_dates, units, calendar)
    105             "Cannot decode times from a non-standard calendar, {!r}, using "
--> 106             "pandas.".format(calendar)
    107         )

OutOfBoundsDatetime: Cannot decode times from a non-standard calendar, 'gregorian_proleptic', using pandas.

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in _decode_cf_datetime_dtype(data, units, calendar, use_cftime)
     76     try:
---> 77         result = decode_cf_datetime(example_value, units, calendar, use_cftime)
     78     except Exception:

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in decode_cf_datetime(num_dates, units, calendar, use_cftime)
    160             dates = _decode_datetime_with_cftime(
--> 161                 flat_num_dates.astype(float), units, calendar
    162             )

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in _decode_datetime_with_cftime(num_dates, units, calendar)
     97     return np.asarray(
---> 98         cftime.num2date(num_dates, units, calendar, only_use_cftime_datetimes=True)
     99     )

cftime/_cftime.pyx in cftime._cftime.num2date()

cftime/_cftime.pyx in cftime._cftime.to_calendar_specific_datetime()

KeyError: 'gregorian_proleptic'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-41-174237fc09de> in <module>
----> 1 xr.decode_cf(ds, decode_times=True)

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/conventions.py in decode_cf(obj, concat_characters, mask_and_scale, decode_times, decode_coords, drop_variables, use_cftime, decode_timedelta)
    594         drop_variables=drop_variables,
    595         use_cftime=use_cftime,
--> 596         decode_timedelta=decode_timedelta,
    597     )
    598     ds = Dataset(vars, attrs=attrs)

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/conventions.py in decode_cf_variables(variables, attributes, concat_characters, mask_and_scale, decode_times, decode_coords, drop_variables, use_cftime, decode_timedelta)
    496             stack_char_dim=stack_char_dim,
    497             use_cftime=use_cftime,
--> 498             decode_timedelta=decode_timedelta,
    499         )
    500         if decode_coords:

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/conventions.py in decode_cf_variable(name, var, concat_characters, mask_and_scale, decode_times, decode_endianness, stack_char_dim, use_cftime, decode_timedelta)
    336         var = times.CFTimedeltaCoder().decode(var, name=name)
    337     if decode_times:
--> 338         var = times.CFDatetimeCoder(use_cftime=use_cftime).decode(var, name=name)
    339 
    340     dimensions, data, attributes, encoding = variables.unpack_for_decoding(var)

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in decode(self, variable, name)
    425             units = pop_to(attrs, encoding, "units")
    426             calendar = pop_to(attrs, encoding, "calendar")
--> 427             dtype = _decode_cf_datetime_dtype(data, units, calendar, self.use_cftime)
    428             transform = partial(
    429                 decode_cf_datetime,

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in _decode_cf_datetime_dtype(data, units, calendar, use_cftime)
     85             "if it is not installed."
     86         )
---> 87         raise ValueError(msg)
     88     else:
     89         dtype = getattr(result, "dtype", np.dtype("object"))

ValueError: unable to decode time units 'days since 2016-01-01 00:00:00' with "calendar 'gregorian_proleptic'". Try opening your dataset with decode_times=False or installing cftime if it is not installed.

यदि यह उपयोगी है, तो यहां पूर्ण नोटबुक है।

0
Rich Signell 3 सितंबर 2020, 16:46

1 उत्तर

सबसे बढ़िया उत्तर

विचाराधीन डेटासेट में एक और गैर-समन्वय चर (dstart) है जिसे गलत gregorian_proleptic कैलेंडर विशेषता भी मिली है।

यदि यह सही ढंग से सेट है:

ds.dstart.attrs['calendar']='proleptic_gregorian'
xr.decode_cf(ds, decode_times=True)

Cf डिकोडिंग काम करेगी।

1
kmuehlbauer 8 सितंबर 2020, 12:21