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

时间:2012-03-09 01:23:55

标签: python datetime matplotlib

我正在尝试根据日期绘制信息。我有一个日期列表,格式为“01/02/1991”。

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

x = parser.parse(date).strftime('%Y%m%d'))

,提供19910102

然后我尝试使用num2date

import matplotlib.dates as dates
new_x = dates.num2date(x)

绘图:

plt.plot_date(new_x, other_data, fmt="bo", tz=None, xdate=True)

但是我收到了一个错误。它说“ValueError:年份超出范围”。任何解决方案?

3 个答案:

答案 0 :(得分:98)

您可以使用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

然后绘制:

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()

结果:

enter image description here

答案 1 :(得分:16)

正如@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'

答案 2 :(得分:6)

我的信誉太低,无法对@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()