home / github / issues

Menu
  • Search all tables
  • GraphQL API

issues: 722437965

This data as json

id node_id number title user state locked assignee milestone comments created_at updated_at closed_at author_association active_lock_reason draft pull_request body reactions performed_via_github_app state_reason repo type
722437965 MDU6SXNzdWU3MjI0Mzc5NjU= 4514 encode_cf_datetime: reference_date can not be "2000-02-30" 10194086 closed 0     3 2020-10-15T15:25:10Z 2021-01-05T15:42:37Z 2021-01-05T15:42:37Z MEMBER      

What happened:

I try to save the result of ds.resample("time": "Q-FEB").mean() with a 360_day calendar as netcdf. Thus, my first date is cftime.Datetime360Day(2000-02-30) (note the day). xarray then tries to use units='days since 2000-02-30' which fails with ValueError: day is out of range for month.

What you expected to happen:

The dataset can be saved.

Minimal Complete Verifiable Example:

```python import cftime import xarray as xr

time = xr.cftime_range("2000-02-30", "2001-01-01", freq="3M", calendar="360_day")

dates = np.asarray(time) reference_date = xr.coding.times.infer_datetime_units(dates)

'days since 2000-02-30 00:00:00.000000'

xr.coding.times.encode_cf_datetime(time)

ValueError

``` Traceback:

```python-traceback --------------------------------------------------------------------------- OutOfBoundsDatetime Traceback (most recent call last) ~/.conda/envs/ipcc_ar6/lib/python3.7/site-packages/xarray/coding/times.py in encode_cf_datetime(dates, units, calendar) 367 # parse with cftime instead --> 368 raise OutOfBoundsDatetime 369 assert dates.dtype == "datetime64[ns]" OutOfBoundsDatetime: During handling of the above exception, another exception occurred: ValueError Traceback (most recent call last) <ipython-input-157-727cb22f83b1> in <module> 4 time = xr.cftime_range("2000-02-30", "2001-01-01", freq="3M", calendar="360_day") 5 ----> 6 xr.coding.times.encode_cf_datetime(time) ~/.conda/envs/ipcc_ar6/lib/python3.7/site-packages/xarray/coding/times.py in encode_cf_datetime(dates, units, calendar) 385 386 except (OutOfBoundsDatetime, OverflowError): --> 387 num = _encode_datetime_with_cftime(dates, units, calendar) 388 389 num = cast_to_int_if_safe(num) ~/.conda/envs/ipcc_ar6/lib/python3.7/site-packages/xarray/coding/times.py in _encode_datetime_with_cftime(dates, units, calendar) 332 return np.nan if d is None else cftime.date2num(d, units, calendar) 333 --> 334 return np.vectorize(encode_datetime)(dates) 335 336 ~/.conda/envs/ipcc_ar6/lib/python3.7/site-packages/numpy/lib/function_base.py in __call__(self, *args, **kwargs) 2089 vargs.extend([kwargs[_n] for _n in names]) 2090 -> 2091 return self._vectorize_call(func=func, args=vargs) 2092 2093 def _get_ufunc_and_otypes(self, func, args): ~/.conda/envs/ipcc_ar6/lib/python3.7/site-packages/numpy/lib/function_base.py in _vectorize_call(self, func, args) 2159 res = func() 2160 else: -> 2161 ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args) 2162 2163 # Convert args to object arrays first ~/.conda/envs/ipcc_ar6/lib/python3.7/site-packages/numpy/lib/function_base.py in _get_ufunc_and_otypes(self, func, args) 2119 2120 inputs = [arg.flat[0] for arg in args] -> 2121 outputs = func(*inputs) 2122 2123 # Performance note: profiling indicates that -- for simple ~/.conda/envs/ipcc_ar6/lib/python3.7/site-packages/xarray/coding/times.py in encode_datetime(d) 330 331 def encode_datetime(d): --> 332 return np.nan if d is None else cftime.date2num(d, units, calendar) 333 334 return np.vectorize(encode_datetime)(dates) cftime/_cftime.pyx in cftime._cftime.date2num() cftime/_cftime.pyx in cftime._cftime._dateparse() ValueError: day is out of range for month ```

Anything else we need to know?:

This goes wrong here: https://github.com/pydata/xarray/blob/15537497136345ed67e9e8b089bcd4573df0b2ea/xarray/coding/times.py#L249-L250

A possible fix is to add the following lines:

python try: cftime._cftime._dateparse(reference_date) except ValueError: reference_date = type(dates[0])(dates[0].year, dates[0].month, 1) reference_date = xr.coding.times.format_cftime_datetime(reference_date)

To workaround set the encoding manually:

python encoding = {} encoding['time'] = {'units': 'days since 1850-01-01'} ds.to_netcdf(filename, encoding=encoding)

{
    "url": "https://api.github.com/repos/pydata/xarray/issues/4514/reactions",
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
  completed 13221727 issue

Links from other tables

  • 2 rows from issues_id in issues_labels
  • 3 rows from issue in issue_comments
Powered by Datasette · Queries took 0.795ms · About: xarray-datasette