ValueError: ordinal must be >= 1

Viewed 17451

This Code, Takes 2 co-ordinates for a straight line from google finance and places 3rd point on the same line at some distance.

 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()

the following error occurs with lots of Traceback

dt = datetime.datetime.fromordinal(ix).replace(tzinfo=UTC)
ValueError: ordinal must be >= 1

The above code works well when I just plot the numeric values without using datetime and pandas. I think the issue might be in datetime or in matplotlib.

I know this question might look duplicate, but I cannot relate my problem to any other solutions here.

3 Answers

The error is due to matplotlib's inability to find the location of x-axis value along the x-axis.

The plot from the first two lines has numeric values for x-axis, whereas the third line is trying to plot a datetime on the same axis. While plotting the third line plt.plot(Dates, Highs), matplotlib tries to find the x-axis location for the date and fails with the error.

I'd just like to add to the answers here and possibly clarify why this may occur, for anyone visiting this in the future.

The ValueError: ordinal must be >= 1 error can occur when an axis is specified to display as a time or date, but matplotlib cannot interpret the data for that axis as either type.

For example, if the following is plotted:

fig, ax = plt.subplots()

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

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

It will generate the aforementioned error, as the data input to the x axis is a list of integers, and the axis.xaxis_date() function requires datetime objects.

To correct this the x-axis data must be datetime objects:

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) ...]
Related