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


75

我正在尝试根据日期绘制信息。我有日期列表,格式为“ 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:年份超出范围”。有什么办法吗?


啊,我给了一个不好的榜样日期。我的日期列表中实际上没有2012年12月31日。我已将其更改为1991
1

2
help(num2date):“ x是一个浮点值,其值加上从0001-01-01开始的天数”,因此x = 19910102不对应1991
Kyss Tao 2012年

这个问题中的解析器是什么?
约翰·斯诺

Answers:


22

就像@KyssTaohelp(dates.num2date)所说的那样,x必须是一个浮点数,表示从0001-01-01开始的天数加1。因此,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
如果您也可以添加该import语句,以帮助像我这样的python新手,那就太好了。
kkuilla

145

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

结果:

在此处输入图片说明


10
@bernie谢谢,它确实帮助了我。但是,在我的问题中,我的时间太多了,所以整个情节被阻塞了。如何使用您的方法在X轴上显示每五个日期或第十个日期?
user1506145

1
@erik我知道这有点晚了,但是我删除了两个set_major行,并为我清除了它。失去了一些功能,但仍然有所改进。
TheBoro

1
不幸的是,它显示的不是我3个日期,而是其他6个日期(尽管在此间隔内)。使用matplotlib-1.5.1
Groosha

41

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

1
请注意,如果您要获取系列或索引的第一个日期和最后一个日期,那么由于这是一个范围,因此最后一个日期将被截断,并且您的代码将出错。假设Date索引上有一列,则可以执行以下操作:days = mdates.drange(d1.index.min(),d1.index.max() + dt.timedelta(days=1),dt.timedelta(days=1))。本质上,我在范围上限值的日期添加了1天。
大卫·埃里克森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.