Python,matplotlib,用日期作图

Python, matplotlib, plotting with dates

这是我第一次在这里提问。我对编程很陌生,也不是很有天赋,我目前正在开发一个小程序,我试图根据日期绘制 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()

感谢您的所有帮助!

我不能发表评论,因为在这个 stackexchange 上我还没有 50 声望。但是,这应该是评论,而不是答案,因为它并没有真正回答您的问题。

你的代码有不少问题。首先是您实际上需要绘制数据:

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

plt.plot(x, y)

我不完全确定这是否可行,因为我认为 pyplot 需要 x 轴和 y 轴的数字,而您的 x 列表当前是字符串。这也意味着更改 x 轴的格式应该在那里出现问题,因为 DateFormatter 期望的是日期时间对象,而不是字符串。

忽略以下语法错误:

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?

您的代码中存在一些问题。其实不止一对。首先你声明 dates=[] 并用你从文件中读取的日期填充它,你做的也很奇怪!

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

["String element",浮动,"String element",浮动....]

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

遍历了那个空列表
[dt.datetime.strptime(d, '%m/%d/%Y').date() for d in dates]

正在创建空的日期时间对象。最后你永远不会真正调用 plot 函数,因为

>>> 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. 您实际上将它们发送给绘制。

还可以使用 plt.plot_dates 函数绘制它们,该函数会为您处理大部分漂亮的日期格式。

我强烈建议您从 IDLE 开始,开始定义简短而清晰的函数,然后逐步实现完整的解决方案。希望对你有帮助。