使用Python的matplotlib在x轴上绘制日期

irl*_*irl 56 python datetime matplotlib

我试图绘制日期信息.我有一个日期列表,格式为"01/02/1991".

我通过执行以下操作转换它们:

x = parser.parse(date).strftime('%Y%m%d'))
Run Code Online (Sandbox Code Playgroud)

这使 19910102

然后我尝试使用num2date

import matplotlib.dates as dates
new_x = dates.num2date(x)
Run Code Online (Sandbox Code Playgroud)

绘图:

plt.plot_date(new_x, other_data, fmt="bo", tz=None, xdate=True)
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误.它说"ValueError:年份超出范围".有解决方案吗

ber*_*nie 114

您可以更简单地使用plot()而不是使用plot_date().

首先,将您的字符串转换为Python的实例datetime.date:

import datetime as dt

dates = ['01/02/1991','01/03/1991','01/04/1991']
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]
y = range(len(x)) # many thanks to Kyss Tao for setting me straight here
Run Code Online (Sandbox Code Playgroud)

然后情节:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

  • @bernie谢谢,这对我很有帮助.然而,在我的问题中,我有太多的日子,所以整个情节都被堵塞了.如何使用您的方法在x轴上显示每个第五个日期或每个第十个日期? (9认同)
  • @erik我知道这有点晚了,但我删除了两行 set_major 行,这为我清除了它。失去了一些功能,但仍然是一个改进。 (2认同)

小智 49

我的声誉太低,无法向 @bernie 回复添加评论,回复 @user1506145。我遇到了同样的问题。

1

答案是一个区间参数,它可以解决问题

2

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import datetime as dt

np.random.seed(1)

N = 100
y = np.random.rand(N)

now = dt.datetime.now()
then = now + dt.timedelta(days=100)
days = mdates.drange(now,then,dt.timedelta(days=1))

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=5))
plt.plot(days,y)
plt.gcf().autofmt_xdate()
plt.show()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您要获取系列或索引的第一个日期和最后一个日期,那么由于这是一个范围,最后一个日期将被截止,并且您的代码将遇到错误。假设您的索引上有一个“Date”列,那么您可以执行以下操作:“days = mdates.drange(d1.index.min(),d1.index.max() + dt.timedelta(days=1),dt” .timedelta(天=1))`。本质上,我在范围上限值的日期上添加了 1 天。 (3认同)
  • 最好在这里使用 `mdates.AutoDateLocator()` 而不是 `mdates.DayLocator(interval=5)` 来自动计算 x 轴上应显示多少个日期标签。这可以回答@just_learning上面的问题。 (2认同)

mat*_*fee 20

正如@KyssTao一直在说的help(dates.num2date)那样,x必须是一个浮点数给出自0001-01-01以来的天数加一.因此,19910102不是1991年1月2日,因为如果您从0001-01-01计算19910101天,您将获得54513年或类似的东西(除以365.25,一年中的天数).

datestr2num改为使用(见help(dates.datestr2num)):

new_x = dates.datestr2num(date) # where date is '01/02/1991'
Run Code Online (Sandbox Code Playgroud)

  • 如果你也可以添加 import 语句,那就太好了,以帮助像我这样的 python 新手。 (4认同)