3

Hi I am trying to convert a list of dates as strings to an x axis in matplotlib and I can't seem to get it to come out right.

dates =  ['2014-05-06', '2014-05-07', '2014-05-08', '2014-05-09', '2014-05-10', '2014-05-11', '2014-05-12', '2014-05-13']

import matplotlib
from matplotlib import pyplot
from matplotlib import dates

converted_dates = matplotlib.dates.datestr2num(dates)
x_axis = (converted_dates)

y_axis = range(0,8)
pyplot.plot( x_axis, y_axis, '-' )
pyplot.show()

This brings back 1 2 3 4 5 6 7 on the x axis on the chart, what am I missing. I would like this to display 2014-05-06 etc

Trying_hard
  • 8,931
  • 29
  • 62
  • 85
  • This duplicates, e.g., http://stackoverflow.com/questions/3486121/how-to-plot-data-against-specific-dates-on-the-x-axis-using-matplotlib – cphlewis May 14 '14 at 01:05
  • maybe I am wrong but those are datetime objects and not strings. I am trying to convert strings to 2 date numbers – Trying_hard May 14 '14 at 01:08
  • cgn has the answer, assuming that what you need is for the plot to compare and space the dates correctly? I'm confused by " I would like this to display 2014-05-06 etc" when that's what you have to start with. – cphlewis May 14 '14 at 01:22
  • @cphlewis Yes, but you can't plot against a list of strings, you _can_ plot against a list of dates. – tacaswell May 14 '14 at 01:24
  • So what does .datestr2num do then? – Trying_hard May 14 '14 at 01:41

4 Answers4

8

Is this the goal? (Threw in rotation because it almost always comes up, with dates.)

datelist =  ['2014-05-06', '2014-05-07', '2014-05-08', '2014-05-09', '2014-05-10',    '2014-05-11', '2014-05-12', '2014-05-13']

import matplotlib
from matplotlib import pyplot
from matplotlib import dates
import datetime

converted_dates = list(map(datetime.datetime.strptime, datelist, len(datelist)*['%Y-%m-%d']))
x_axis = converted_dates
formatter = dates.DateFormatter('%Y-%m-%d')


y_axis = range(0,8)
pyplot.plot( x_axis, y_axis, '-' )
ax = pyplot.gcf().axes[0] 
ax.xaxis.set_major_formatter(formatter)
pyplot.gcf().autofmt_xdate(rotation=25)
pyplot.show()

enter image description here

Azat Ibrakov
  • 9,998
  • 9
  • 38
  • 50
cphlewis
  • 15,759
  • 4
  • 46
  • 55
4

The idea of using matplotlib.dates.datestr2num is in principle correct. You would then need to tell matplotlib to actually interprete the resulting numbers as dates. One easy option is to use plot_date instead of plot.

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates

dates =  ['2014-05-06', '2014-05-07', '2014-05-08', '2014-05-09', 
          '2014-05-10', '2014-05-11', '2014-05-12', '2014-05-13']

converted_dates = matplotlib.dates.datestr2num(dates)
x_axis = (converted_dates)

y_axis = range(0,8)
plt.plot_date( x_axis, y_axis, '-' )

plt.show()
ImportanceOfBeingErnest
  • 321,279
  • 53
  • 665
  • 712
0

Try using strptime. Documentation is here: https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

For example:

import datetime
sDate = '2014-05-06'
dtDate = datetime.datetime.strptime(sDate,"%m-%d-%Y")

matplotlib can compare datetime objects.

cgnorthcutt
  • 3,890
  • 34
  • 41
  • Also potential duplicate: http://stackoverflow.com/questions/12070193/why-is-datetime-strptime-not-working-in-this-simple-example – cgnorthcutt May 14 '14 at 01:11
  • That is not really a duplicate, it uses `strptime`, but the issue in that case is calling the wrong module, not issues with making it work – tacaswell May 14 '14 at 01:26
0

The easiest is to use numpy directly:


import matplotlib
from matplotlib import pyplot
from matplotlib import dates
import numpy as np

dates =  ['2014-05-06', '2014-05-07', '2014-05-08', '2014-05-09',
          '2014-05-10', '2014-05-11', '2014-05-12', '2014-05-13']

converted_dates = np.array(dates, dtype='datetime64[ms]')

ydata = range(0,8)
pyplot.plot(converted_dates, ydata, '-' )
pyplot.show()
Jody Klymak
  • 4,979
  • 2
  • 15
  • 31