ValueError:ordinal必须>> = 1

时间:2017-07-22 17:41:52

标签: python pandas matplotlib dataframe quantitative-finance

本守则,从谷歌财务中获得直线的2个坐标,并将第3个点放在同一行的某个距离。

 import datetime as dt
 from datetime import timedelta as td
 import matplotlib.pyplot as plt
 from matplotlib import style
 import pandas as pd
 import pandas_datareader.data as web
 import numpy as np

 start = dt.datetime(2017, 7, 1)
 end = dt.datetime(2017, 3, 1)

 # retrieving data from google
 df = web.DataReader('TSLA', 'google', start, )

 Dates = df.index
 Highs = df['High'] # Getting only the values from the 'High' Column.

 Highest_high = np.amax(Highs)  # returns the Highest value
      for i, h in enumerate(Highs):
           if h == Highest_high :
              Highests_index = i
 #Highests_index = Highs.argmax()  # returns the index of Highest value

 Highest_high_2 = sorted(Highs)[-2]
 for i, j in enumerate(Highs):
      if j == Highest_high_2 :
         Highests_index_2 = i

 #================Problem Maybe starting from here========================

 x = [Highests_index, Highests_index_2]
 y = [Highest_high, Highest_high_2]
 coefficients = np.polyfit(x, y, 1)

 polynomial = np.poly1d(coefficients)
 # the np.linspace lets you set number of data points, line length.
 x_axis = np.linspace(3,Highests_index_2 + 1, 3)
 y_axis = polynomial(x_axis)

 plt.plot(x_axis, y_axis)
 plt.plot(x[0], y[0], 'go')
 plt.plot(x[1], y[1], 'go')
 plt.plot(Dates, Highs)
 plt.grid('on')
 plt.show()

许多Traceback发生以下错误

  

dt = datetime.datetime.fromordinal(ix).replace(tzinfo = UTC)
  ValueError:ordinal必须是> = 1

当我只绘制数值而不使用datetime和pandas时,上面的代码很有效。我认为问题可能出在日期时间或matplotlib中。

我知道这个问题可能看起来重复,但我无法将我的问题与此处的任何其他解决方案联系起来。

3 个答案:

答案 0 :(得分:1)

错误是由于matplotlib无法沿x轴找到x轴值的位置。

前两行的图表具有x轴的数值,而第三行则试图在同一轴上绘制datetime。在绘制第三行plt.plot(Dates, Highs)时,matplotlib会尝试查找日期的x轴位置,并因错误而失败。

答案 1 :(得分:0)

抱歉,实际上由于第3行最后一行发生了错误。我删除了plt.plot()Dates, Highs)并且所有工作都像Charm一样!

答案 2 :(得分:0)

我想在这里补充答案,并可能为以后访问的任何人澄清为什么会发生这种情况。

将轴指定为显示为时间或日期时,可能会发生ValueError: ordinal must be >= 1错误,但是matplotlib无法将该轴的数据解释为任何一种类型。

例如,如果绘制了以下内容:

fig, ax = plt.subplots()

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

ax.xaxis_date()
ax.plot(x, y, '-k')

由于输入到x轴的数据是整数列表,并且axis.xaxis_date()函数需要 datetime 对象,因此会产生上述错误。

要解决此问题,x轴数据必须是 datetime 对象:

date_str = [datetime.datetime(2020, 10, 16, 1, 0, 2), datetime.datetime(2020 10, 15, 12,18,31),datetime.datetime(2020, 11, 21, 18, 3, 6) ...]