Trying_hard
Trying_hard

Reputation: 9501

matplotlib string to dates

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

Upvotes: 3

Views: 18210

Answers (4)

Jody Klymak
Jody Klymak

Reputation: 5913

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

Upvotes: 0

cphlewis
cphlewis

Reputation: 16249

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

Upvotes: 8

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339150

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

Upvotes: 4

cgnorthcutt
cgnorthcutt

Reputation: 4036

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.

Upvotes: 0

Related Questions