Skip to content

Commit

Permalink
fix cf_xarray.utils._is_datetime_like (#289)
Browse files Browse the repository at this point in the history
Co-authored-by: dcherian <[email protected]>
  • Loading branch information
rcaneill and dcherian authored Jan 21, 2022
1 parent 37b2c4b commit 29a0a6e
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 10 deletions.
17 changes: 17 additions & 0 deletions cf_xarray/tests/test_accessor.py
Original file line number Diff line number Diff line change
Expand Up @@ -1409,6 +1409,23 @@ def test_cf_standard_name_table_version():
assert expected_info == actual_info


def test_add_canonical_attributes_0_dim():
"""test if works for variables with 0 dimension"""
xr.DataArray(
0, attrs={"standard_name": "sea_water_potential_temperature"}
).cf.add_canonical_attributes()


def test_datetime_like():
"""test for 0 or >= 2 time dimensions"""
da = xr.DataArray(
np.timedelta64(1, "D"),
attrs={"standard_name": "sea_water_age_since_surface_contact"},
)
new_attrs = da.cf.add_canonical_attributes().attrs
assert "units" not in new_attrs and "description" in new_attrs


@pytest.mark.parametrize("override", [True, False])
@pytest.mark.parametrize("skip", ["units", None])
@pytest.mark.parametrize("verbose", [True, False])
Expand Down
38 changes: 28 additions & 10 deletions cf_xarray/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,42 @@
from typing import Any, Dict, Iterable
from xml.etree import ElementTree

import numpy as np
from xarray import DataArray

try:
import cftime
except ImportError:
cftime = None


def _contains_cftime_datetimes(array) -> bool:
"""Check if an array contains cftime.datetime objects"""
# Copied / adapted from xarray.core.common
from xarray.core.pycompat import is_duck_dask_array

if cftime is None:
return False
else:
if array.dtype == np.dtype("O") and array.size > 0:
sample = array.ravel()[0]
if is_duck_dask_array(sample):
sample = sample.compute()
if isinstance(sample, np.ndarray):
sample = sample.item()
return isinstance(sample, cftime.datetime)
else:
return False

def _is_datetime_like(da: DataArray) -> bool:
import numpy as np

def _is_datetime_like(da: DataArray) -> bool:
if np.issubdtype(da.dtype, np.datetime64) or np.issubdtype(
da.dtype, np.timedelta64
):
return True

try:
import cftime

if isinstance(da.data[0], cftime.datetime):
return True
except ImportError:
pass
# if cftime was not imported, _contains_cftime_datetimes will return False
if _contains_cftime_datetimes(da.data):
return True

return False

Expand Down

0 comments on commit 29a0a6e

Please sign in to comment.