Как правильно передать даты в Matplotlib для построения графика?

Рейтинг: 1Ответов: 2Опубликовано: 24.06.2023

Датасет

Загружаю датафрейм:

df = pd.read_csv('Sales.csv', sep=';', index_col=None, parse_dates=['DT'])

При попытке отобразить график с значениями по x в формате datetime64[ns]:

plt.plot(df['DT'], df['Sales'])

получаю:

По х datetime

при попытке передать в формате Matplotlib

plt.plot(matplotlib.dates.date2num(df['DT']), df['Sales'])

результат тот же

При отображении графика с значениями по x в формате object:

plt.plot(df['DT'].dt.strftime('%Y-%m-%d'), df['Sales'])

отображает верно: По x object

Как правильно передать даты в Matplotlib в формате datetime64[ns] для построения графика?

Ответы

▲ 2Принят

Надо таки обращать внимание на предупреждения (хотя у вас его может и не было):

UserWarning: Parsing dates in DD/MM/YYYY format when dayfirst=False (the default) was specified. This may lead to inconsistently parsed dates! Specify a format to ensure consistent parsing.

Добавляем параметр dayfirst=True, о котором идёт речь в предупреждении:

df = pd.read_csv('Sales.csv', sep=';', index_col=None, parse_dates=['DT'], dayfirst=True)

И вот:

введите сюда описание изображения

Проблема была в том, что некоторые из дат парсились при чтении неправильно. По умолчанию у американцев первым идёт месяц, а потом уже день, ну и затем год.

▲ 3

Ваша проблема состоит в том, как функция pd.read_csv() с параметром parse_dates= конвертирует даты в соответствующем столбце.

  • С датой 13.04.2023 не будет проблем (13-е апреля), потому что не возможно иначе — не существует 13-ий месяц, но

  • дату 12.04.2023 будет при переводе в datetime64[ns] интерпретировать по-американски как 4-е декабря.

И так за собой идущие дни 12.04.2023 и 13.04.2023 не будут в вашем графике возле себя, т.к. первый из них будет не в апреле, а в декабре:

введите сюда описание изображения

Потому надо сделать так, как уже было сказано в других ответах — добавить параметр dayfirst=True, т.е. «всегда интерпретировать первую часть даты как число дня в месяце».