Search code examples
pythonpandasdatetimematplotlibpython-datetime

Changing the formatting of a datetime axis


I have a series whose index is datetime that I wish to plot. I want to plot the values of the series on the y axis and the index of the series on the x axis. The Series looks as follows:

2014-01-01     7
2014-02-01     8
2014-03-01     9
2014-04-01     8
...

I generate a graph using plt.plot(series.index, series.values). But the graph looks like:

graph

The problem is that I would like to have only year and month (yyyy-mm or 2016 March). However, the graph contains hours, minutes and seconds. How can I remove them so that I get my desired formatting?


Solution

  • import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    
    # sample data
    N = 30
    drange = pd.date_range("2014-01", periods=N, freq="MS")
    np.random.seed(365)  # for a reproducible example of values
    values = {'values':np.random.randint(1,20,size=N)}
    df = pd.DataFrame(values, index=drange)
    
    fig, ax = plt.subplots()
    ax.plot(df.index, df.values)
    ax.set_xticks(df.index)
    
    # use formatters to specify major and minor ticks
    ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m"))
    ax.xaxis.set_minor_formatter(mdates.DateFormatter("%Y-%m"))
    _ = plt.xticks(rotation=90)    
    

    enter image description here