Matplotlib puede representar fechas y horas directamente a partir de objetos datetime de Python, arrays datetime64 de NumPy o columnas de fechas de pandas. El módulo matplotlib.dates proporciona localizadores para colocar los ticks y formateadores para elegir cómo se muestran las fechas.
Pasa las fechas como valores del eje X. Matplotlib detecta que son fechas y elige la posición y el formato de los ticks automáticamente.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()
fig, ax = plt.subplots()
ax.plot(dates, values)
# plt.show()

Cuando las etiquetas se solapan, como en el gráfico anterior, tienes varias opciones: usar un formato más compacto, rotar las etiquetas o reducir el número de ticks.
ConciseDateFormatter muestra la información mínima necesaria en cada etiqueta (por ejemplo, el año una sola vez) y suele ser la mejor opción para series temporales.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()
import matplotlib.dates as mdates
fig, ax = plt.subplots()
ax.plot(dates, values)
locator = mdates.AutoDateLocator()
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(mdates.ConciseDateFormatter(locator))
# plt.show()

Utiliza DateFormatter con una cadena de formato para elegir cómo se muestran las fechas. Los códigos más habituales son %Y (año), %m (mes en número), %b (nombre del mes abreviado), %B (nombre del mes completo), %d (día), %H (hora) y %M (minutos).
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()
import matplotlib.dates as mdates
fig, ax = plt.subplots()
ax.plot(dates, values)
ax.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
# plt.show()

Los localizadores establecen la posición de los ticks. MonthLocator, WeekdayLocator, DayLocator, YearLocator y HourLocator colocan un tick cada cierto intervalo. También puedes agregar ticks secundarios con un localizador diferente.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()
import matplotlib.dates as mdates
fig, ax = plt.subplots()
ax.plot(dates, values)
ax.xaxis.set_major_locator(mdates.MonthLocator(interval = 3))
ax.xaxis.set_minor_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter("%b"))
# plt.show()

fig.autofmt_xdate rota y alinea a la derecha las etiquetas de las fechas para que no se solapen. También puedes usar ax.tick_params(axis = "x", labelrotation = 45).
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()
fig, ax = plt.subplots()
ax.plot(dates, values)
fig.autofmt_xdate()
# plt.show()

Para hacer zoom en un periodo pasa fechas a set_xlim. Pueden ser objetos datetime o timestamps de pandas.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dates = pd.date_range("2025-01-01", periods = 365, freq = "D")
values = np.random.default_rng(1).normal(size = 365).cumsum()
import matplotlib.dates as mdates
fig, ax = plt.subplots()
ax.plot(dates, values)
ax.set_xlim(pd.Timestamp("2025-03-01"), pd.Timestamp("2025-06-30"))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d %b"))
# plt.show()

Si tus datos están en un data frame de pandas con una columna de fechas (o un índice de fechas) puedes pasar las columnas a matplotlib directamente. Asegúrate de que la columna es de tipo fecha y conviértela con pd.to_datetime si es necesario.
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({"date": ["2025-01-01", "2025-02-01", "2025-03-01"],
"value": [10, 15, 12]})
df["date"] = pd.to_datetime(df["date"])
fig, ax = plt.subplots()
ax.plot(df["date"], df["value"])
# plt.show()
Aprende a personalizar el resto de elementos de los ejes en el tutorial sobre la personalización de los ejes en matplotlib o cómo crear un gráfico de líneas en matplotlib.
También te puede interesar