Точность дат и эпох в Matplotlib

PythonPythonBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Это пошаговая лабораторная работа, которая демонстрирует, как обрабатывать точность дат и эпоху в Matplotlib. Matplotlib может работать с объектами .datetime и numpy.datetime64 с использованием конвертера единиц, который распознает эти даты и преобразует их в числа с плавающей точкой. До Matplotlib 3.3 по умолчанию для этого преобразования возвращался float, представляющий количество дней с "0000-12-31T00:00:00". Начиная с Matplotlib 3.3 по умолчанию используется количество дней с "1970-01-01T00:00:00". Это позволяет более высокую точность для современных дат.

Советы по работе с ВМ

После завершения запуска ВМ щелкните в верхнем левом углу, чтобы переключиться на вкладку Notebook, чтобы получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится. Валидация операций не может быть автоматизирована из-за ограничений в Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортировать необходимые пакеты

Первым шагом является импорт необходимых пакетов, в том числе datetime, matplotlib.pyplot и numpy.

import datetime
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates

Установить эпоху по старому умолчанию

Следующим шагом является установка эпоху по старому умолчанию, то есть количество дней с "0000-12-31T00:00:00". Это делается с использованием метода mdates.set_epoch.

mdates.set_epoch('0000-12-31T00:00:00')

Преобразовать datetime в дату Matplotlib

Теперь, когда эпоху установлено, мы можем преобразовать объект datetime в дату Matplotlib с использованием функции mdates.date2num.

date1 = datetime.datetime(2000, 1, 1, 0, 10, 0, 12, tzinfo=datetime.timezone.utc)
mdate1 = mdates.date2num(date1)

Возврат по кругу даты

Затем мы можем выполнить обратное преобразование даты с использованием функции mdates.num2date, чтобы убедиться, что преобразование точное.

date2 = mdates.num2date(mdate1)

Установить эпоху по новому умолчанию

Для использования современных дат с точностью до микросекунд нам нужно установить эпоху по новому умолчанию, то есть количество дней с "1970-01-01T00:00:00".

mdates.set_epoch('1970-01-01T00:00:00')

Преобразовать datetime в дату Matplotlib с новой эпохой

Теперь, когда эпоху установлено по новому умолчанию, мы можем преобразовать объект datetime в дату Matplotlib с использованием функции mdates.date2num.

date1 = datetime.datetime(2020, 1, 1, 0, 10, 0, 12, tzinfo=datetime.timezone.utc)
mdate1 = mdates.date2num(date1)

Возврат по кругу даты с новой эпохой

Затем мы можем выполнить обратное преобразование даты с использованием функции mdates.num2date, чтобы убедиться, что преобразование точное.

date2 = mdates.num2date(mdate1)

Преобразовать numpy.datetime64 в дату Matplotlib

Объекты numpy.datetime64 имеют точность до микросекунд для гораздо большей временной области, чем объекты .datetime. Однако в настоящее время время Matplotlib преобразуется только обратно в объекты datetime, которые имеют разрешение до микросекунд и годы, которые охватывают только период с 0000 по 9999.

date1 = np.datetime64('2000-01-01T00:10:00.000012')
mdate1 = mdates.date2num(date1)

Построение графиков

Этот шаг демонстрирует, как эпох влияет на построение графиков. При старом стандартном значении эпох времени округлялись в ходе внутреннего преобразования date2num, что приводило к скачкам в данных.

mdates.set_epoch('0000-12-31T00:00:00')

x = np.arange('2000-01-01T00:00:00.0', '2000-01-01T00:00:00.000100', dtype='datetime64[us]')
xold = np.array([mdates.num2date(mdates.date2num(d)) for d in x])
y = np.arange(0, len(x))

fig, ax = plt.subplots(layout='constrained')
ax.plot(xold, y)
ax.set_title('Epoch: ' + mdates.get_epoch())
ax.xaxis.set_tick_params(rotation=40)
plt.show()

Для дат, построенных с использованием более современной эпохи, график гладкий:

mdates.set_epoch('1970-01-01T00:00:00')

fig, ax = plt.subplots(layout='constrained')
ax.plot(x, y)
ax.set_title('Epoch: ' + mdates.get_epoch())
ax.xaxis.set_tick_params(rotation=40)
plt.show()

Резюме

Этот практикум демонстрирует, как обрабатывать точность дат и эпох в Matplotlib. Мы можем установить эпоху по старому или новому умолчанию с использованием метода mdates.set_epoch. Затем мы можем преобразовать объекты datetime или numpy.datetime64 в даты Matplotlib с использованием функции mdates.date2num, а также выполнить обратное преобразование дат с использованием функции mdates.num2date, чтобы убедиться, что преобразование точное. Мы также можем построить графики с разными эпхами, чтобы наблюдать за различиями в графиках.