十一、Unix 时间

在这个 Matplotlib 教程中,我们将介绍如何处理 unix 时间戳的转换,然后在图形中绘制日期戳。 使用 Yahoo Finance API,你会注意到,如果你使用较大的时间间隔,如1y(一年),你会得到我们一直在使用的日期戳,但如果你使用10d(10 天),反之你会得到 unix 时间的时间戳。

Unix 时间是 1970 年 1 月 1 日以后的秒数,它是跨程序的标准化时间表示方法。 也就是说,Matplotlib 并不欢迎 unix 时间戳。 这里是你可以使用 Matplotlib 来处理 unix 时间的方式:

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import urllib
  4. import datetime as dt
  5. import matplotlib.dates as mdates
  6. def bytespdate2num(fmt, encoding='utf-8'):
  7. strconverter = mdates.strpdate2num(fmt)
  8. def bytesconverter(b):
  9. s = b.decode(encoding)
  10. return strconverter(s)
  11. return bytesconverter
  12. def graph_data(stock):
  13. fig = plt.figure()
  14. ax1 = plt.subplot2grid((1,1), (0,0))
  15. stock_price_url = 'http://chartapi.finance.yahoo.com/instrument/1.0/'+stock+'/chartdata;type=quote;range=10d/csv'
  16. source_code = urllib.request.urlopen(stock_price_url).read().decode()
  17. stock_data = []
  18. split_source = source_code.split('\n')
  19. for line in split_source:
  20. split_line = line.split(',')
  21. if len(split_line) == 6:
  22. if 'values' not in line and 'labels' not in line:
  23. stock_data.append(line)
  24. date, closep, highp, lowp, openp, volume = np.loadtxt(stock_data,
  25. delimiter=',',
  26. unpack=True)
  27. dateconv = np.vectorize(dt.datetime.fromtimestamp)
  28. date = dateconv(date)
  29. ## date, closep, highp, lowp, openp, volume = np.loadtxt(stock_data,
  30. ## delimiter=',',
  31. ## unpack=True,
  32. ## converters={0: bytespdate2num('%Y%m%d')})
  33. ax1.plot_date(date, closep,'-', label='Price')
  34. for label in ax1.xaxis.get_ticklabels():
  35. label.set_rotation(45)
  36. ax1.grid(True)#, color='g', linestyle='-', linewidth=5)
  37. plt.xlabel('Date')
  38. plt.ylabel('Price')
  39. plt.title('Interesting Graph\nCheck it out')
  40. plt.legend()
  41. plt.subplots_adjust(left=0.09, bottom=0.20, right=0.94, top=0.90, wspace=0.2, hspace=0)
  42. plt.show()
  43. graph_data('TSLA')

所以在这里,我们所做的是 unix 时间的写入处理,并注释掉我们以前的代码,因为我们为之后的使用而保存它。 这里的主要区别是:

  1. dateconv = np.vectorize(dt.datetime.fromtimestamp)
  2. date = dateconv(date)

这里,我们将时间戳转换为日期戳,然后将其转换为 Matplotlib 想要的时间。

现在,由于某些原因,我的 unix 时间带有另一行包含 6 个元素的数据,并且它包含了术语label,因此,在我们解析数据的for循环中,我们为你再添加一个需要注意的检查:

  1. for line in split_source:
  2. split_line = line.split(',')
  3. if len(split_line) == 6:
  4. if 'values' not in line and 'labels' not in line:
  5. stock_data.append(line)

现在你的图表应该类似:

十一、Unix 时间 - 图1

这里的所有扁平线条的原因是市场关闭。 有了这个短期数据,我们可以得到日内数据。 所以交易开放时有很多点,然后市场关闭时就没有了,然后又是一堆,然后又是没有。