Pandas Plotting Muestra todos los valores de fecha en el eje x (matplolib solo muestra algunos valores) con el formato MMM-YYYY [duplicado]
import os
import pandas as pd
import matplotlib.pyplot as plt
import datetime
df = pd.read_excel(DATA_DIR+"/"+file_list[0], index_col="Date")
df.head(5)

smooth = df['Pur. Rate'].rolling(window=20).mean()
smooth.plot()

Obtengo el siguiente gráfico y necesito trazar todos los valores de fecha para cada MES-AÑO en el eje x. Quiero mostrar todos los meses y años formateados en diagonal en el eje x en el formato (19 de febrero). Puedo agrandar el tamaño del gráfico para que quepa todo, ya que lo guardaré como jpg.
Quiero que el eje x tenga los siguientes valores: 16 de enero, 16 de febrero, 16 de marzo, 16 de abril, 16 de mayo, 16 de junio, 16 de julio, 16 de agosto, 16 de septiembre, 16 de octubre, 16 de noviembre, 16 de diciembre, 17 de enero , 17 de febrero… (Quiero mostrar todos estos valores, matplotlib trunca automáticamente esto, quiero evitar eso)
Respuestas
Como se mencionó en los comentarios, debe configurar tanto el localizador como el formateador. Esto se explica bien en la documentación de matplotlib para gráficos en general y por separado para ejes de fecha y hora . Consulte también una explicación de los TickLocators . Los códigos de formato se derivan de los códigos de formato strftime () y strptime () de Python .
from matplotlib import pyplot as plt
import pandas as pd
from matplotlib.dates import MonthLocator, DateFormatter
#fake data
import numpy as np
np.random.seed(123)
n = 100
df = pd.DataFrame({"Dates": pd.date_range("20180101", periods=n, freq="10d"), "A": np.random.randint(0, 100, size=n), "B": np.random.randint(0, 100, size=n),})
df.set_index("Dates", inplace=True)
print(df)
ax = df.plot()
#defines the tick location
ax.xaxis.set_major_locator(MonthLocator())
#defines the label format
ax.xaxis.set_major_formatter(DateFormatter("%b-%y"))
ax.tick_params(axis="x", labelrotation= 90)
plt.tight_layout()
plt.show()
Salida de muestra:

Con solo funciones de pandas, puede usar stftime () para reemplazar su índice de esquema de fechas '% Y-% m-% d' por una nueva forma '% b-% Y' y algunos parámetros en la gráfica .
smoothdf.plot(xticks=smoothdf.index.strftime('%m-%Y').unique()).set_xticklabels(smoothdf.index.strftime('%b-%Y').unique())
xticks para especificar qué etiqueta desea ver.
set_xticklabels para modificar la lista de etiquetas.
Le sugiero que use matplotlib y no pandas plot, y haga algo como esto para trazar las fechas en el formato que especificó:
import matplotlib.dates as mdates
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
myFmt = mdates.DateFormatter('%b-%Y') # date formatter for matplotlib
# %b is Month abbreviated name, %Y is the Year
# ... after some code
fig, ax = plt.subplots(figsize=(15,8))
ax.xaxis.set_major_formatter(myFmt)
fig.autofmt_xdate()
# Plot data ...
ax.set_xticks("""... define how often to show the date""")
Puede obtener los datos del marco de datos con algo como: .to_numpy()
o .values()
.
Consulte esta documentación para conocer la set_xticks
función.