BlueQuant
BlueQuant

Reputation: 345

ValueError: ordinal must be >= 1

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.

Upvotes: 5

Views: 19843

Answers (3)

Gurfuffle
Gurfuffle

Reputation: 784

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

Upvotes: 1

Jughead
Jughead

Reputation: 887

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.

Upvotes: 2

BlueQuant
BlueQuant

Reputation: 345

Sorry, Actually the error occured due to the 3rd last line. i deleted the plt.plot()Dates, Highs) And everything Worked like Charm!

Upvotes: -1

Related Questions