Как правильно передать даты в Matplotlib для построения графика?
Загружаю датафрейм:
df = pd.read_csv('Sales.csv', sep=';', index_col=None, parse_dates=['DT'])
При попытке отобразить график с значениями по x в формате datetime64[ns]:
plt.plot(df['DT'], df['Sales'])
получаю:
при попытке передать в формате Matplotlib
plt.plot(matplotlib.dates.date2num(df['DT']), df['Sales'])
результат тот же
При отображении графика с значениями по x в формате object:
plt.plot(df['DT'].dt.strftime('%Y-%m-%d'), df['Sales'])
Как правильно передать даты в 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)
И вот:
Проблема была в том, что некоторые из дат парсились при чтении неправильно. По умолчанию у американцев первым идёт месяц, а потом уже день, ну и затем год.
Ваша проблема состоит в том, как функция pd.read_csv() с параметром parse_dates= конвертирует даты в соответствующем столбце.
С датой
13.04.2023не будет проблем (13-е апреля), потому что не возможно иначе — не существует 13-ий месяц, нодату
12.04.2023будет при переводе в datetime64[ns] интерпретировать по-американски как 4-е декабря.
И так за собой идущие дни 12.04.2023 и 13.04.2023 не будут в вашем графике возле себя, т.к. первый из них будет не в апреле, а в декабре:
Потому надо сделать так, как уже было сказано в других ответах — добавить параметр dayfirst=True, т.е. «всегда интерпретировать первую часть даты как число дня в месяце».



