Matplotlib DateFormatter para etiqueta de eje no funciona

Estoy tratando de ajustar el formato de las tags de marca de fecha del eje x para que solo muestre los valores de Año y Mes. Por lo que he encontrado en línea, tengo que usar mdates.DateFormatter , pero no está mdates.DateFormatter efecto con mi código actual como está. ¿Alguien ve dónde está el problema? (Las fechas son el índice del dataframe de pandas).

 import matplotlib.dates as mdates import matplotlib.pyplot as plt import pandas as pd fig = plt.figure(figsize = (10,6)) ax = fig.add_subplot(111) ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) basicDF['some_column'].plot(ax=ax, kind='bar', rot=75) ax.xaxis_date() 

introduzca la descripción de la imagen aquí

Código de escenario reproducible:

 import numpy as np import matplotlib.dates as mdates import matplotlib.pyplot as plt import pandas as pd rng = pd.date_range('1/1/2014', periods=20, freq='m') blah = pd.DataFrame(data = np.random.randn(len(rng)), index=rng) fig = plt.figure(figsize = (10,6)) ax = fig.add_subplot(111) ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) blah.plot(ax=ax, kind='bar') ax.xaxis_date() 

Todavía no puedo tener solo el año y el mes para aparecer.

Si configuro el formato después de .plot, obtengo un error como este:

ValueError: DateFormatter encontró un valor de x = 0, que es una fecha no válida. Esto suele ocurrir porque no ha informado al eje que está trazando fechas, por ejemplo, con una x.xaxis_date() .

Es lo mismo si lo pongo antes de ax.xaxis_date () o después.

Los pandas simplemente no funcionan bien con formatos de fecha y hora personalizados.

Necesitas usar simplemente matplotlib en casos como este.

 import numpy import matplotlib.pyplot as plt import matplotlib.dates as mdates import pandas N = 20 numpy.random.seed(N) dates = pandas.date_range('1/1/2014', periods=N, freq='m') df = pandas.DataFrame( data=numpy.random.randn(N), index=dates, columns=['A'] ) fig, ax = plt.subplots(figsize=(10, 6)) ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) ax.bar(df.index, df['A'], width=25, align='center') 

Y eso me da:

introduzca la descripción de la imagen aquí

La respuesta de Paul será suficiente, pero también puede utilizar la función to_datetime() de panda para usar su serie existente en el dataframe:

 import numpy as np import matplotlib.pyplot as plt from matplotlib.dates import DateFormatter import pandas as pd rng = pd.date_range('1/1/2014', periods=20, freq='m') blah = pd.DataFrame(data = np.random.randn(len(rng)), index=pd.to_datetime(rng)) fig, ax = plt.subplots() ax.xaxis.set_major_formatter(DateFormatter('%m-%Y')) ax.bar(blah.index, blah[0], width=25, align='center') 

Resultará en:

un gráfico de barras con las fechas formateadas como se describe

Puedes ver los diferentes formatos disponibles aquí .