Estoy ttwigndo dos series de pandas. El índice es una fecha (1-1 a 12-31)
s1.plot() s2.plot()
pd.plot () interpreta las fechas y las asigna a los valores de los ejes como tales:
Me gustaría modificar las marcas principales para que sean el primero de cada mes y las marcas menores para los días intermedios.
Esto funciona:
%matplotlib notebook import matplotlib as mpl import matplotlib.dates as mdates import matplotlib.pyplot as plt import pandas as pd df = pd.read_csv('data.csv') df['Date'] = pd.to_datetime(df['Date']).dt.strftime('%m-%d') s2014max = df2014.groupby(['Date'], sort=True)['Data_Value'].max()/10 s2014min = df2014.groupby(['Date'], sort=True)['Data_Value'].min()/10 #remove the leap day and convert to datetime for plotting s2014min = s2014min[s2014min.index != '02-29'] s2014max = s2014max[s2014max.index != '02-29'] dateslist = s2014min.index.tolist() dates = [pd.datetime.strptime(date, '%m-%d').date() for date in dateslist] plt.figure() ax = plt.gca() ax.xaxis.set_major_locator(mdates.MonthLocator()) ax.xaxis.set_minor_locator(mdates.DayLocator()) monthFmt = mdates.DateFormatter('%b') dayFmt = mdates.DateFormatter('%d') ax.xaxis.set_major_formatter(monthFmt) ax.xaxis.set_minor_formatter(dayFmt) ax.tick_params(direction='out', pad=15) s2014min.plot() s2014max.plot()
Esto da como resultado que no haya garrapatas:
Una forma posible es usar matplotlib para trazar las fechas en lugar de los pandas.
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates import numpy as np dates = pd.date_range("2016-01-01", "2016-12-31" ) y = np.cumsum(np.random.normal(size=len(dates))) df = pd.DataFrame({"Dates" : dates, "y": y}) fig, ax = plt.subplots() ax.plot_date(df["Dates"], df.y, '-') ax.xaxis.set_major_locator(mdates.MonthLocator()) ax.xaxis.set_minor_locator(mdates.DayLocator()) monthFmt = mdates.DateFormatter('%b') ax.xaxis.set_major_formatter(monthFmt) plt.show()
Estabas tan cerca! Todo lo que tenía que hacer era agregar los formateadores de manera similar a como lo hizo la otra respuesta. Aquí hay una muestra de trabajo similar a su código (tenga en cuenta que hice el mío en el portátil ipython, por lo tanto, el %matplotlib inline
).
%matplotlib inline import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates from datetime import datetime, timedelta from random import random y = [random() for i in range(25)] x = [(datetime.now() - timedelta(days=i)) for i in range(25)] x.reverse() s = pd.Series(y, index=x) # NOTE: S, not df, since you said you were using series # format the ticks ax = plt.gca() ax.xaxis.set_major_locator(mdates.MonthLocator()) ax.xaxis.set_minor_locator(mdates.DayLocator()) monthFmt = mdates.DateFormatter('%b') dayFmt = mdates.DateFormatter('%d') ax.xaxis.set_major_formatter(monthFmt) # This is what you needed ax.xaxis.set_minor_formatter(dayFmt) # This is what you needed ax.tick_params(direction='out', pad=15) # format the coords message box s.plot(figsize=(10,3))
que se verá así: