使用 Matplotlib.dates.datestr2num 将 pandas DatetimeIndex 转换为 'float days format'

Converting pandas DatetimeIndex to 'float days format' with Matplotlib.dates.datestr2num

有些 Matplotlib 方法需要 'float days format' 天。 datestr2num 是一个转换器函数,但它与相关的 pandas 对象一起掉落:

In [3]: type(df.index)
Out[3]: pandas.tseries.index.DatetimeIndex
In [4]: type(df.index[0])
Out[4]: pandas.tslib.Timestamp
In [5]: mpl.dates.date2num(df.index)
Out [5]: ...
AttributeError: 'numpy.datetime64' object has no attribute 'toordinal'

这提供了 'float days format' 中可用的时间列表:

dates = [mpl.dates.date2num(t) for t in df.index]

但是有没有更好的方法呢?

您可以使用 DatetimeIndex 的 to_pydatetime 方法(这会将其转换为 datetime.datetime 的数组,mpl.dates.date2num 将知道如何处理它们):

mpl.dates.date2num(df.index.to_pydatetime())

date2num 本身不处理 pandas DatetimeIndex 的原因是因为 matplotlib 尚不支持 numpy datetime64 dtype(这是数据存储在 DatetimeIndex 中的方式)。