3
votes

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

4
maybe I am wrong but those are datetime objects and not strings. I am trying to convert strings to 2 date numbers - Trying_hard
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
@cphlewis Yes, but you can't plot against a list of strings, you can plot against a list of dates. - tacaswell
So what does .datestr2num do then? - Trying_hard

4 Answers

8
votes

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

4
votes

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()
0
votes

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.

0
votes

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()