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
。
请确认您确实拥有继续下一步计划所需的一切。
这意味着:
- 您以可以处理的有意义的格式从文件中读取数据。这意味着如果您计划使用
striptime
解析您的日期,那么您有一个格式为 %m/%d/%Y
的日期列表:[01/1/2012, 01/2/2012...]
- 在用
striptime
解析日期后,您有一个 datetime.datetime 对象的列表! (有意义的对象列表)
- 您实际上将它们发送给绘制。
还可以使用 plt.plot_dates
函数绘制它们,该函数会为您处理大部分漂亮的日期格式。
我强烈建议您从 IDLE 开始,开始定义简短而清晰的函数,然后逐步实现完整的解决方案。希望对你有帮助。
这是我第一次在这里提问。我对编程很陌生,也不是很有天赋,我目前正在开发一个小程序,我试图根据日期绘制 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
。
请确认您确实拥有继续下一步计划所需的一切。 这意味着:
- 您以可以处理的有意义的格式从文件中读取数据。这意味着如果您计划使用
striptime
解析您的日期,那么您有一个格式为%m/%d/%Y
的日期列表:[01/1/2012, 01/2/2012...]
- 在用
striptime
解析日期后,您有一个 datetime.datetime 对象的列表! (有意义的对象列表) - 您实际上将它们发送给绘制。
还可以使用 plt.plot_dates
函数绘制它们,该函数会为您处理大部分漂亮的日期格式。
我强烈建议您从 IDLE 开始,开始定义简短而清晰的函数,然后逐步实现完整的解决方案。希望对你有帮助。