Фильтрация даты на оси x с помощью Python matplotlib
Я пытаюсь отобразить информацию о датах. У меня есть список дат в формате "01/02/1991".
Я преобразовал их, выполнив следующие действия:
x = parser.parse(date).strftime('%Y%m%d'))
который дает 19910102
Затем я попытался использовать num2date
import matplotlib.dates as dates
new_x = dates.num2date(x)
Черчение:
plt.plot_date(new_x, other_data, fmt="bo", tz=None, xdate=True)
Но я получаю сообщение об ошибке. В нем говорится: "ValueError: год выходит за пределы допустимого диапазона". Любые решения?
Ответы
Ответ 1
Как сказал @KyssTao, help(dates.num2date)
говорит, что x
должен быть float, дающим количество дней с 0001-01-01 плюс один. Следовательно, 19910102
не 2/янв/1991, потому что, если вы посчитали 19910101 дней с 0001-01-01, вы получите что-то в году 54513 или аналогичном (разделите на 365,25, количество дней в году).
Используйте datestr2num
вместо этого (см. help(dates.datestr2num)
):
new_x = dates.datestr2num(date) # where date is '01/02/1991'
Ответ 2
Вы можете сделать это проще, используя plot()
вместо plot_date()
.
Сначала преобразуем ваши строки в экземпляры Python datetime.date
:
import datetime as dt
dates = ['01/02/1991','01/03/1991','01/04/1991']
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]
y = range(len(x)) # many thanks to Kyss Tao for setting me straight here
Затем сюжет:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()
Результат:
![enter image description here]()