Introdução
O ~.dates.ConciseDateFormatter é uma ferramenta útil para formatar as marcas de data (date ticks) ao trabalhar com Matplotlib. Neste laboratório, você aprenderá como usar este formatador para aprimorar as strings escolhidas para os rótulos das marcas (tick labels) e minimizar as strings usadas nesses rótulos o máximo possível.
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ê.
Formatador Padrão
Começamos observando o formatador padrão e sua saída detalhada. Plotamos dados ao longo do tempo e vemos como o formatador padrão exibe a data e a hora.
import datetime
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates
## create time data
base = datetime.datetime(2005, 2, 1)
dates = [base + datetime.timedelta(hours=(2 * i)) for i in range(732)]
N = len(dates)
np.random.seed(19680801)
y = np.cumsum(np.random.randn(N))
## plot data
fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(6, 6))
lims = [(np.datetime64('2005-02'), np.datetime64('2005-04')),
(np.datetime64('2005-02-03'), np.datetime64('2005-02-15')),
(np.datetime64('2005-02-03 11:00'), np.datetime64('2005-02-04 13:20'))]
for nn, ax in enumerate(axs):
ax.plot(dates, y)
ax.set_xlim(lims[nn])
## rotate labels...
for label in ax.get_xticklabels():
label.set_rotation(40)
label.set_horizontalalignment('right')
axs[0].set_title('Default Date Formatter')
plt.show()
Formatador de Data Conciso
Em seguida, exploramos o ~.dates.ConciseDateFormatter e sua saída. Criamos um novo gráfico com o formatador de data conciso e vemos como ele difere do formatador padrão.
fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(6, 6))
for nn, ax in enumerate(axs):
locator = mdates.AutoDateLocator(minticks=3, maxticks=7)
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
ax.plot(dates, y)
ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter')
plt.show()
Registrando um Conversor
Se todas as chamadas para eixos que possuem datas devem ser feitas usando este conversor, provavelmente é mais conveniente usar o registro de unidades. Registramos um conversor com o registro de unidades e plotamos dados usando o formatador de data conciso.
import datetime
import matplotlib.units as munits
converter = mdates.ConciseDateConverter()
munits.registry[np.datetime64] = converter
munits.registry[datetime.date] = converter
munits.registry[datetime.datetime] = converter
fig, axs = plt.subplots(3, 1, figsize=(6, 6), layout='constrained')
for nn, ax in enumerate(axs):
ax.plot(dates, y)
ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter')
plt.show()
Localização de Formatos de Data
Os formatos de data podem ser localizados se os formatos padrão não forem desejáveis, manipulando uma das três listas de strings. Modificamos os rótulos para serem "dia mês ano", em vez do ISO "ano mês dia".
fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(6, 6))
for nn, ax in enumerate(axs):
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)
formatter.formats = ['%y', ## ticks are mostly years
'%b', ## ticks are mostly months
'%d', ## ticks are mostly days
'%H:%M', ## hrs
'%H:%M', ## min
'%S.%f', ] ## secs
## these are mostly just the level above...
formatter.zero_formats = [''] + formatter.formats[:-1]
## ...except for ticks that are mostly hours, then it is nice to have
## month-day:
formatter.zero_formats[3] = '%d-%b'
formatter.offset_formats = ['',
'%Y',
'%b %Y',
'%d %b %Y',
'%d %b %Y',
'%d %b %Y %H:%M', ]
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
ax.plot(dates, y)
ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter')
plt.show()
Registrando um Conversor com Localização
Também podemos registrar um conversor com localização passando argumentos de palavra-chave para ~.dates.ConciseDateConverter e registrando os tipos de dados que você usará com o registro de unidades.
import datetime
formats = ['%y', ## ticks are mostly years
'%b', ## ticks are mostly months
'%d', ## ticks are mostly days
'%H:%M', ## hrs
'%H:%M', ## min
'%S.%f', ] ## secs
## these can be the same, except offset by one level....
zero_formats = [''] + formats[:-1]
## ...except for ticks that are mostly hours, then it's nice to have month-day
zero_formats[3] = '%d-%b'
offset_formats = ['',
'%Y',
'%b %Y',
'%d %b %Y',
'%d %b %Y',
'%d %b %Y %H:%M', ]
converter = mdates.ConciseDateConverter(
formats=formats, zero_formats=zero_formats, offset_formats=offset_formats)
munits.registry[np.datetime64] = converter
munits.registry[datetime.date] = converter
munits.registry[datetime.datetime] = converter
fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(6, 6))
for nn, ax in enumerate(axs):
ax.plot(dates, y)
ax.set_xlim(lims[nn])
axs[0].set_title('Concise Date Formatter registered non-default')
plt.show()
Resumo
Neste laboratório, você aprendeu como usar o ~.dates.ConciseDateFormatter para formatar os rótulos de data ao trabalhar com Matplotlib. Você também aprendeu como localizar formatos de data e registrar conversores para tornar o processo mais conveniente.