How to fix matplotlib axvline() TypeError: '<' not supported between instances of 'Timedelta' and 'numpy.float64'

Problem:

When adding an axvline to a matplotlib plot with a timedelta X-axis, you get the following error:

--> 147 ax1.axvline(xpos, color='black', linestyle='-')

File /usr/local/lib/python3.10/dist-packages/matplotlib/axes/_axes.py:893, in Axes.axvline(self, x, ymin, ymax, **kwargs)
    891 # Strip away the units for comparison with non-unitized bounds.
    892 xx, = self._process_unit_info([("x", x)], kwargs)
--> 893 scalex = (xx < xmin) or (xx > xmax)
    895 trans = self.get_xaxis_transform(which='grid')
    896 l = mlines.Line2D([x, x], [ymin, ymax], transform=trans, **kwargs)

TypeError: '<' not supported between instances of 'Timedelta' and 'numpy.float64'

Solution

Currently, axvline does not support passing Timedelta objects directly.

Instead, you need to pass it as a float in nanoseconds.

If you want to pass a pandas pd.Timedelta object, you can convert it to nanoseconds like this:

import pandas as pd

xpos = pd.Timedelta('1 days')

ax.axvline(xpos.total_seconds()*1e9, color='black', linestyle='-')