使用 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 中的方式)。
有些 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 中的方式)。