diff --git a/doc/whats-new.rst b/doc/whats-new.rst index ecf1702c356..dec80590c11 100644 --- a/doc/whats-new.rst +++ b/doc/whats-new.rst @@ -61,6 +61,10 @@ Internal Changes ~~~~~~~~~~~~~~~~ - Move non-CF related ``ensure_dtype_not_object`` from conventions to backends (:pull:`9828`). By `Kai Mühlbauer `_. +- Move handling of scalar datetimes into ``_possibly_convert_objects`` + within ``as_compatible_data``. This is consistent with how lists of these objects + will be converted (:pull:`9900`). + By `Kai Mühlbauer `_. .. _whats-new.2024.11.0: diff --git a/xarray/core/variable.py b/xarray/core/variable.py index 07113d66b5b..9d56555f31b 100644 --- a/xarray/core/variable.py +++ b/xarray/core/variable.py @@ -6,7 +6,6 @@ import numbers import warnings from collections.abc import Callable, Hashable, Mapping, Sequence -from datetime import timedelta from functools import partial from types import EllipsisType from typing import TYPE_CHECKING, Any, NoReturn, cast @@ -232,10 +231,16 @@ def _as_nanosecond_precision(data): def _possibly_convert_objects(values): """Convert arrays of datetime.datetime and datetime.timedelta objects into - datetime64 and timedelta64, according to the pandas convention. For the time - being, convert any non-nanosecond precision DatetimeIndex or TimedeltaIndex - objects to nanosecond precision. While pandas is relaxing this in version - 2.0.0, in xarray we will need to make sure we are ready to handle + datetime64 and timedelta64, according to the pandas convention. + + * datetime.datetime + * datetime.timedelta + * pd.Timestamp + * pd.Timedelta + + For the time being, convert any non-nanosecond precision DatetimeIndex or + TimedeltaIndex objects to nanosecond precision. While pandas is relaxing this + in version 2.0.0, in xarray we will need to make sure we are ready to handle non-nanosecond precision datetimes or timedeltas in our code before allowing such values to pass through unchanged. Converting to nanosecond precision through pandas.Series objects ensures that datetimes and timedeltas are @@ -305,13 +310,6 @@ def convert_non_numpy_type(data): if isinstance(data, tuple): data = utils.to_0d_object_array(data) - if isinstance(data, pd.Timestamp): - # TODO: convert, handle datetime objects, too - data = np.datetime64(data.value, "ns") - - if isinstance(data, timedelta): - data = np.timedelta64(getattr(data, "value", data), "ns") - # we don't want nested self-described arrays if isinstance(data, pd.Series | pd.DataFrame): pandas_data = data.values