Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python';s matplotlib_Python_Datetime_Matplotlib - Fatal编程技术网

使用Python';s matplotlib

使用Python';s matplotlib,python,datetime,matplotlib,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=T

我正试图根据日期绘制信息。我有一份格式为“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:年份超出范围”。有什么解决方案吗?

正如@KyssTao所说,
帮助(dates.num2date)
说,
x
必须是一个浮点数,给出从0001-01-01开始的天数加上一。因此,
19910102
不是1991年1月2日,因为如果你从0001-01-01开始计算19910101天,你会得到54513年或类似年份的数据(除以365.25,一年中的天数)

改用
datestr2num
(请参阅
帮助(dates.datestr2num)
):


您可以更简单地使用
plot()
而不是
plot\u 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()
结果:


我的声誉太低,无法在@bernie response中添加评论,回复为@user1506145。我遇到过同样的问题

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

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


啊,我举了一个糟糕的例子。实际上,我的日期列表中没有2012年12月31日。我已将其更改为1991年1月2日。帮助(num2date):“x是一个浮点值,它给出一个加上自0001-01-01以来的天数”,因此x=19910102与1991年1月2日不对应。在这个问题上,解析器是什么?@bernie谢谢,它真的帮助了我。然而,在我的问题中,我有太多的时间,所以整个情节都被阻塞了。如何用你的方法在x轴上显示每五个日期或每十个日期?@erik我知道这有点晚了,但我删除了两条set_主线,这为我清除了障碍。失去了一些功能,但仍然有改进。不幸的是,它显示的不是3个日期,而是6个其他日期(尽管在这段时间间隔内)。使用matplotlib-1.5.1如果您还可以添加
import
语句,以帮助像我这样的python新手,那就太好了。@kkuilla如果这仍然相关,我猜他将其命名为
import matplotlib.dates as dates
请注意,如果您选择的是系列或索引的第一个日期和最后一个日期,然后,由于这是一个范围,最后一个日期将被截断,您的代码将出错。假设索引中有一个
Date
列,则可以执行以下操作:
days=mdates.drange(d1.index.min(),d1.index.max()+dt.timedelta(days=1),dt.timedelta(days=1))
。基本上,我在范围上限值的日期上加了1天。
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()