Python,matplotlib,用日期绘图

时间:2015-02-24 19:31:52

标签: python date matplotlib plot

这是我第一次在这里提问。我是一个非常新的编程而且不是很有天赋,我正在研究一个小小的程序,我试图将日元的EURUSD价格绘制出来,我遇到了无法在x轴上绘制日期的问题。我一直在网上寻求帮助和答案,但没有任何好运。无论如何,到目前为止,我的代码是:

j=1
dates = []
price = []
with open('EURUSD_day.csv', 'r') as f:
    reader = csv.reader(f)
    print (f)
    for row in reader:
        if j > 1:
        dates.append(row[1])
        dates.append(float(row[6]))
    j = j + 1
import datetime as dt
dates = []
x = [dt.datetime.strptime(d, '%m/%d/%Y').date() for d in dates]
y = range(len(x))
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.plot
plt.gcf().autofmt_xdate
plt.show()

我感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

我不被允许评论,因为在这个stackexchange上我还没有50个声望。但是,这应该是一个评论,而不是一个答案,因为它并没有真正回答你的问题。

您的代码存在很多问题。首先,您确实需要绘制数据:

你的plt.plot行应该是这样的:

plt.plot(x, y)

我不完全确定这会有效,因为我认为pyplot需要x和y轴的数字,而x的列表当前是字符串。这也意味着更改x轴的格式应该存在问题,因为DateFormatter期望的是datetime对象,而不是字符串。

这忽略了以下语法错误:

for row in reader:
        if j > 1:
        dates.append(row[1])
        dates.append(float(row[6]))

这不是有效的python代码。大概你的意思是以下几点?

for row in reader:
    if j > 1:
        dates.append(row[1])
        dates.append(float(row[6]))

在任何情况下,为什么不从文件中读取它们时将它们转换为datetime.date?

答案 1 :(得分:0)

您的代码中存在一些问题。实际上不仅仅是一对夫妇。首先你声明dates=[]并填写你从文件中读取的日期,你也做得很奇怪!

您将日期填入列表中,如下所示:

[" String element",float," String element",float ....]

然后你忘记了所有这一切,因为你在dates=[]语句之后再次声明一个新的空列表import,然后你用生成器通过那个空列表

[dt.datetime.strptime(d, '%m/%d/%Y').date() for d in dates]

创建空的日期时间对象。最后你实际上从未调用过绘图函数,因为

>>> plt.plot
<function plot at 0x04607C48>

你永远不会发送任何实际数据。你的情节缺乏任何论据:plt.plot([1,2,3,4])。最后再次重复相同的错误,因为

>>> plt.gcf().autofmt_xdate
<bound method Figure.autofmt_xdate of <matplotlib.figure.Figure object at 0x02F97FB0>>

你再也不会调用自动编码日期plt.gcf().autofmt_xdate的实际方法。

请确认您确实拥有继续执行计划下一步所需的一切。 这意味着:

  1. 您可以使用可以处理的有意义格式从文件中读取数据。这意味着,如果您计划使用striptime解析日期,那么您的日期列表的格式为%m/%d/%Y[01/1/2012, 01/2/2012...]
  2. 在您使用striptime解析日期之后,您有一个datetime.datetime对象列表! (一个有意义的对象列表)
  3. 您实际发送它们以进行绘制。
  4. 同样要绘制它们,使用plt.plot_dates函数来处理大部分漂亮的日期格式。

    我强烈建议您从IDLE入手,开始定义小而简短的功能,并逐步完成溶剂的工作。希望它有任何帮助。