Построение дат на оси X с помощью Matplotlib Python - PullRequest
51 голосов
/ 09 марта 2012

Я пытаюсь нанести информацию против даты.У меня есть список дат в формате "01/02/1991".

Я преобразовал их, выполнив следующее:

x = parser.parse(date).strftime('%Y%m%d'))

, что дает 19910102

Затем я попытался использовать num2date

import matplotlib.dates as dates
new_x = dates.num2date(x)

Plotting:

plt.plot_date(new_x, other_data, fmt="bo", tz=None, xdate=True)

Но я получаю ошибку.Там написано "ValueError: год вне диапазона".Любые решения?

Ответы [ 2 ]

102 голосов
/ 09 марта 2012

Вы можете сделать это проще, используя 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

17 голосов
/ 09 марта 2012

Как говорил @KyssTao, help(dates.num2date) говорит, что x должно быть числом с плавающей точкой, указывающим количество дней с 0001-01-01 плюс один.Следовательно, 19910102 - это не 2 / январь / 1991 г., потому что если бы вы посчитали 19910101 день с 0001-01-01, вы получите что-то в 54513 году или аналогичном (делите на 365,25, количество дней в году).1004 *

Используйте взамен datestr2num (см. help(dates.datestr2num)):

new_x = dates.datestr2num(date) # where date is '01/02/1991'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...