小编典典

使用matplotlib在x轴上绘制datetimeindex会在熊猫0.15中创建错误的刻度,而0.14则相反

python

我用一些随机值和一个DatetimeIndex创建一个简单的pandas数据框,如下所示:

import pandas as pd
from numpy.random import randint
import datetime as dt
import matplotlib.pyplot as plt

# create a random dataframe with datetimeindex
dateRange = pd.date_range('1/1/2011', '3/30/2011', freq='D')
randomInts = randint(1, 50, len(dateRange))
df = pd.DataFrame({'RandomValues' : randomInts}, index=dateRange)

然后我用两种不同的方式绘制它:

# plot with pandas own matplotlib wrapper
df.plot()

# plot directly with matplotlib pyplot
plt.plot(df.index, df.RandomValues)

plt.show()

(不要同时使用这两个语句,因为它们会绘制在同一图形上。)

我使用 Python 3.4 64bitmatplotlib 1.4 。使用 pandas 0.14时
,两个语句都给出了预期的绘图(它们使用的x轴格式略有不同,这是可以的;请注意,数据是随机的,因此绘图看起来并不相同):
熊猫0.14:熊猫情节

熊猫0.14:matplotlib图

但是,当使用 pandas 0.15时 ,pandas图看起来不错,但是matplotlib图在x轴上有一些奇怪的刻度格式:

熊猫0.15:熊猫情节

熊猫0.15:matplotlib图

此行为有什么充分的理由,为什么它已从熊猫0.14更改为0.15?


阅读 230

收藏
2021-01-20

共1个答案

小编典典

请注意,此错误已在pandas 0.15.1(https://github.com/pandas-
dev/pandas/pull/8693)中修复,plt.plot(df.index, df.RandomValues)现在可以再次使用。


行为发生这种变化的原因是,从0.15开始,pandasIndex对象不再是numpy ndarray子类。但是 真正的原因
是matplotlib不支持datetime64dtype。

解决方法是,在要使用matplotlibplot函数的情况下,可以使用以下命令将索引转换为python datetime
to_pydatetime

plt.plot(df.index.to_pydatetime(), df.RandomValues)

更详细的解释:

由于Index不再是ndarray子类,因此matplotlib会将索引转换为dtype的numpy数组datetime64(而之前,它保留了Index对象,该对象的标量作为Timestamp值返回datetime.datetime,是matplotlib可以处理的子类)。在该plot函数中,它调用np.atleast_1d()输入,该输入现在返回datetime64数组,matplotlib将其作为整数处理。

我打开了一个与此有关的问题(因为它可能会得到很多使用):https
:
//github.com/pydata/pandas/issues/8614

2021-01-20