python - 时间序列绘制 Pandas 中的不一致

标签 python matplotlib pandas

假设我有一个数据框 df,其中 df.indexdatetime 对象组成,例如

> df.index[0]
datetime.date(2014, 5, 5)

如果我绘制它,Pandas 会很好地保留绘图中的 datetime 类型,这允许用户更改时间序列采样以及绘图的格式选项:

  # Plot the dataframe:
  f     = plt.figure(figsize=(8,8))
  ax    = f.add_subplot(1,1,1)
  lines = df.plot(ax=ax)

  # Choose the sampling rate in terms of dates:
  ax.xaxis.set_major_locator(matplotlib.dates.WeekdayLocator(byweekday=(0,1,2,3,4,5,6),
                                                            interval=1))

  # We can also re-sample the X axis numerically if we want (e.g. every 4 steps):
  N = 4

  ticks      = ax.xaxis.get_ticklocs()
  ticklabels = [l.get_text() for l in ax.xaxis.get_ticklabels()]

  ax.xaxis.set_ticks(ticks[-1::-N][::-1])
  ax.xaxis.set_ticklabels(ticklabels[-1::-N][::-1])

  # Choose a date formatter using a date-friendly syntax:
  ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b\n%d'))

  plt.show()

但是,以上内容适用于boxplot(x 轴的刻度标签呈现为空) :

df2.boxplot(column='A', by='created_dt',ax=ax, sym="k.")

# same code as above ...

在上一个示例中,Pandas 将 x 轴标签转换为 string 类型,因此格式化程序和定位器不再起作用。

这篇文章重复使用了来自以下线程的解决方案:

  1. 已接受对 Pandas timeseries plot setting x-axis major and minor ticks and labels 的回答
  2. 已接受对 Pandas: bar plot xtick frequency 的回答

为什么?如何以允许我使用 matplotlib 日期定位器和格式化程序的方式使用 boxplot

最佳答案

不,实际上连线图都不能正常工作,如果你有年份显示,你会注意到问题:在下面的例子中 xticks 不是 2000,而是 1989。

In [49]:
df=pd.DataFrame({'Val': np.random.random(50)})
df.index=pd.date_range('2000-01-02', periods=50)
f     = plt.figure()
ax    = f.add_subplot(1,1,1)
lines = df.plot(ax=ax)
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%y%b\n%d'))
print ax.get_xlim()
(10958.0, 11007.0)

enter image description here

In [50]:
matplotlib.dates.strpdate2num('%Y-%M-%d')('2000-01-02')
Out[50]:
730121.0006944444
In [51]:
matplotlib.dates.num2date(730121.0006944444)
Out[51]:
datetime.datetime(2000, 1, 2, 0, 1, tzinfo=<matplotlib.dates._UTC object at 0x051FA9F0>)

事实证明,日期时间数据在 pandasmatplotlib 中的处理方式不同:在后者中,2000-1-2 应该是 730121.0006944444,而不是 pandas

中的 10958.0

为了让它正确,我们需要避免使用 pandasplot 方法:

In [52]:
plt.plot_date(df.index.to_pydatetime(), df.Val, fmt='-')
ax=plt.gca()
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%y%b\n%d'))

enter image description here

barplot 类似:

In [53]:
plt.bar(df.index.to_pydatetime(), df.Val, width=0.4)
ax=plt.gca()
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%y%b\n%d'))

enter image description here

关于python - 时间序列绘制 Pandas 中的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24665990/

相关文章:

python - 如何使用 Python 将点放入数字中?

python - Alpha 屏蔽非方形区域 python cv2

python - 如何在seaborn中设置日期时间xlim

python - 如何在 Django 中使用 Matplotlib?

python - 更改单个行值时保持总和约束行的比例

python - 如何通过多列函数对 Pandas 行进行分组

python - 如何限制 Enthought 特征模块中 Float 特征的值?

python - 如何在运行时将 C 程序的输出连接到 python 程序

python-3.x - 我想将字典转换为 pandas dataFrame

python - 使用 Python 验证电子邮件地址