Skip to content

Plotting with time-zone-aware pd.Timestamp axis not possible #7593

Open
@quantsnus

Description

@quantsnus

What is your issue?

When trying to use the plot-method on a DataArray that contains a time axis with time zone aware pandas Timestamps a TypeError is raised.

As a minimal example:

import pandas as pd
import numpy as np
import xarray as xr
time = pd.date_range("2000-02-02 08:00+01:00","2000-02-02 09:00+01:00", 121)
val = np.arange(121)**2
xar = xr.DataArray(val, coords=dict(time=time))
xar.plot()

Results in:

TypeError: Plotting requires coordinates to be numeric, boolean, or dates of type numpy.datetime64, datetime.datetime, cftime.datetime or pandas.Interval. Received data of type object instead.

While matplotlib is capable of handling it. Not in a nice way, but at least without crashing:

import matplotlib.pyplot as plt
plt.figure()
plt.plot(xar.time, xar.values)

grafik

I tried that the same result can be achieved, if in the method issuing the TypeError

xarray/xarray/plot/utils.py

Lines 669 to 681 in 830ee6d

def _ensure_plottable(*args) -> None:
"""
Raise exception if there is anything in args that can't be plotted on an
axis by matplotlib.
"""
numpy_types: tuple[type[object], ...] = (
np.floating,
np.integer,
np.timedelta64,
np.datetime64,
np.bool_,
np.str_,
)

also accepts the pandas DatetimeTZDtype as a dtype, i.e. it is added to the tuple numpy_types.

If there are no objections I would issue a PR extending the tuple.

Related observations

_ensure_plottable removal

I found discussions on removing the _ensure_plottable method entirely (#5762, #5763), which was not followed through but would likely also solve this issue.

Pandas

Pandas itself is able to even plot the time stamps in a nice way. So, maybe in the long-term it might make sense to use these capabilities.

xar.to_series().plot()

grafik

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions