Formateador de marcas de fecha de Matplotlib

MatplotlibMatplotlibBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

El ~.dates.ConciseDateFormatter es una herramienta útil para formatear las marcas de fecha cuando se trabaja con Matplotlib. En este laboratorio, aprenderá a usar este formateador para mejorar las cadenas elegidas para las etiquetas de los ticks y para minimizar las cadenas utilizadas en esas etiquetas de ticks lo máximo posible.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Formateador predeterminado

Comenzamos examinando el formateador predeterminado y su salida detallada. Graficamos datos a lo largo del tiempo y vemos cómo el formateador predeterminado muestra la fecha y la 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()

Formateador de fechas conciso

A continuación, exploramos el ~.dates.ConciseDateFormatter y su salida. Creamos una nueva gráfica con el formateador de fechas conciso y vemos cómo difiere del formateador predeterminado.

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()

Registrar un conversor

Si todas las llamadas a ejes que tienen fechas se deben realizar utilizando este conversor, probablemente sea más conveniente utilizar el registro de unidades. Registramos un conversor con el registro de unidades y graficamos datos utilizando el formateador de fechas 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()

Localización de formatos de fecha

Los formatos de fecha se pueden localizar si los formatos predeterminados no son deseados mediante la manipulación de una de tres listas de cadenas. Modificamos las etiquetas para que sean "día mes año", en lugar del estándar ISO "año mes día".

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 son en su mayoría años
                         '%b',       ## ticks son en su mayoría meses
                         '%d',       ## ticks son en su mayoría días
                         '%H:%M',    ## horas
                         '%H:%M',    ## minutos
                         '%S.%f', ]  ## segundos
    ## estos son en su mayoría solo el nivel superior...
    formatter.zero_formats = [''] + formatter.formats[:-1]
    #...excepto para los ticks que son en su mayoría horas, entonces es bueno tener
    ## día-mes:
    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()

Registrar un conversor con localización

También podemos registrar un conversor con localización pasando argumentos de palabras clave a ~.dates.ConciseDateConverter y registrando los tipos de datos que se utilizarán con el registro de unidades.

import datetime

formats = ['%y',          ## ticks son en su mayoría años
           '%b',     ## ticks son en su mayoría meses
           '%d',     ## ticks son en su mayoría días
           '%H:%M',  ## horas
           '%H:%M',  ## minutos
           '%S.%f', ]  ## segundos
## estos pueden ser los mismos, excepto desplazados un nivel....
zero_formats = [''] + formats[:-1]
#...excepto para los ticks que son en su mayoría horas, entonces es bueno tener día-mes
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()

Resumen

En este laboratorio, aprendiste cómo usar el ~.dates.ConciseDateFormatter para formatear las marcas de fecha cuando trabajas con Matplotlib. También aprendiste cómo localizar los formatos de fecha y registrar conversiones para hacer el proceso más conveniente.