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

5
  • This duplicates, e.g., stackoverflow.com/questions/3486121/… Commented May 14, 2014 at 1:05
  • maybe I am wrong but those are datetime objects and not strings. I am trying to convert strings to 2 date numbers Commented May 14, 2014 at 1: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. Commented May 14, 2014 at 1:22
  • @cphlewis Yes, but you can't plot against a list of strings, you can plot against a list of dates. Commented May 14, 2014 at 1:24
  • So what does .datestr2num do then? Commented May 14, 2014 at 1:41

4 Answers 4

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

Sign up to request clarification or add additional context in comments.

Comments

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

Comments

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.

2 Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.