Precisão de Datas e Épocas no Matplotlib

Beginner

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

Introdução

Este é um laboratório passo a passo que demonstra como lidar com a precisão de datas e épocas no Matplotlib. O Matplotlib pode trabalhar com objetos .datetime e objetos numpy.datetime64 usando um conversor de unidades que reconhece essas datas e as converte em números de ponto flutuante. Antes do Matplotlib 3.3, o padrão para esta conversão retornava um float que representava os dias desde "0000-12-31T00:00:00". A partir do Matplotlib 3.3, o padrão são os dias a partir de "1970-01-01T00:00:00". Isso permite mais resolução para datas modernas.

Dicas para a VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Importar pacotes necessários

O primeiro passo é importar os pacotes necessários, incluindo datetime, matplotlib.pyplot e numpy.

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

Definir a época para o padrão antigo

O próximo passo é definir a época para o padrão antigo, que são os dias desde "0000-12-31T00:00:00". Isso é feito usando o método mdates.set_epoch.

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

Converter datetime para data do matplotlib

Agora que a época foi definida, podemos converter um objeto datetime para uma data do Matplotlib usando a função mdates.date2num.

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

Conversão de ida e volta da data

Podemos então fazer a conversão de ida e volta da data usando a função mdates.num2date para garantir que a conversão seja precisa.

date2 = mdates.num2date(mdate1)

Definir a época para o novo padrão

Para usar datas modernas com precisão de microssegundos, precisamos definir a época para o novo padrão, que são os dias desde "1970-01-01T00:00:00".

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

Converter datetime para data matplotlib com nova época

Agora que a época foi definida para o novo padrão, podemos converter um objeto datetime para uma data Matplotlib usando a função mdates.date2num.

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

Converter a data de volta com a nova época

Podemos então converter a data de volta usando a função mdates.num2date para garantir que a conversão seja precisa.

date2 = mdates.num2date(mdate1)

Converter numpy.datetime64 para data matplotlib

Objetos numpy.datetime64 possuem precisão de microssegundos para um espaço de tempo muito maior do que objetos .datetime. No entanto, atualmente, o tempo Matplotlib é convertido de volta apenas para objetos datetime, que possuem resolução de microssegundos e anos que abrangem apenas de 0000 a 9999.

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

Plotagem

Esta etapa demonstra como a época afeta a plotagem. Com a época padrão antiga, os tempos foram arredondados durante a conversão interna date2num, levando a saltos nos dados.

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('Época: ' + mdates.get_epoch())
ax.xaxis.set_tick_params(rotation=40)
plt.show()

Para datas plotadas usando a época mais recente, o gráfico é suave:

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

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

Resumo

Este laboratório demonstra como lidar com a precisão de datas e épocas no Matplotlib. Podemos definir a época para o padrão antigo ou o novo padrão usando o método mdates.set_epoch. Em seguida, podemos converter objetos datetime ou numpy.datetime64 para datas Matplotlib usando a função mdates.date2num e fazer a conversão de ida e volta das datas usando a função mdates.num2date para garantir que a conversão seja precisa. Também podemos plotar dados com diferentes épocas para observar as diferenças no gráfico.