Reputation: 73
I have been searching about this on entire google, but it looks like I am not able to find exactly what I am looking for.
So, basically, I have two lists: one list consists of timestamp data and a second list consists of values that correspond to that.
Now my issue is: my timestamps are in a following format
['Mon Sep 1 16:40:20 2015', 'Mon Sep 1 16:45:20 2015',
'Mon Sep 1 16:50:20 2015', 'Mon Sep 1 16:55:20 2015']
So, which time format is used in matplotlib
? I tried to plot this straightaway but it gives me:
ValueError: invalid literal
Can I use datetime.datetime.strptime
to convert it? If not, then what is the other way of doing it?
After converting the timestamp
in the proper format, how should I plot the new converted timestamp with it's corresponding value?
Can I use matplotlib.pyplot.plot(time, data)
or do I have to use plot_date
method to plot it?
Upvotes: 7
Views: 31762
Reputation: 1
step 1: from a string
to a datetime
instance
step 2: from a datetime
to a matplotlib
convention compatible float
for dates/times
As usual, devil is hidden in detail.
matplotlib
dates are almost equal, but not equal:
# mPlotDATEs.date2num.__doc__
#
# *d* is either a class `datetime` instance or a sequence of datetimes.
#
# Return value is a floating point number (or sequence of floats)
# which gives the number of days (fraction part represents hours,
# minutes, seconds) since 0001-01-01 00:00:00 UTC, *plus* *one*.
# The addition of one here is a historical artifact. Also, note
# that the Gregorian calendar is assumed; this is not universal
# practice. For details, see the module docstring.
So, highly recommended to re-use their "own" tool:
from matplotlib import dates as mPlotDATEs # helper functions num2date()
# # and date2num()
# # to convert to/from.
Nevertheless, matplotlib brings you arms for this part too:
from matplotlib.dates import DateFormatter, \
AutoDateLocator, \
HourLocator, \
MinuteLocator, \
epoch2num
from matplotlib.ticker import ScalarFormatter, FuncFormatter
and may for example do:
aPlotAX.set_xlim( x_min, x_MAX ) # X-AXIS LIMITs ------------------------------------------------------------------------------- X-LIMITs
#lt.gca().xaxis.set_major_locator( matplotlib.ticker.FixedLocator( secs ) )
#lt.gca().xaxis.set_major_formatter( matplotlib.ticker.FuncFormatter( lambda pos, _: time.strftime( "%d-%m-%Y %H:%M:%S", time.localtime( pos ) ) ) )
aPlotAX.xaxis.set_major_locator( AutoDateLocator() )
aPlotAX.xaxis.set_major_formatter( DateFormatter( '%Y-%m-%d %H:%M' ) ) # ----------------------------------------------------------------------------------------- X-FORMAT
#--------------------------------------------- # 90-deg x-tick-LABELs
plt.setp( plt.gca().get_xticklabels(), rotation = 90,
horizontalalignment = 'right'
)
#------------------------------------------------------------------
Upvotes: 7
Reputation: 1200
Yup, use strptime
import datetime
import matplotlib.pyplot as plt
x = ['Mon Sep 1 16:40:20 2015', 'Mon Sep 1 16:45:20 2015',
'Mon Sep 1 16:50:20 2015', 'Mon Sep 1 16:55:20 2015']
y = range(4)
x = [datetime.datetime.strptime(elem, '%a %b %d %H:%M:%S %Y') for elem in x]
(fig, ax) = plt.subplots(1, 1)
ax.plot(x, y)
fig.show()
Upvotes: 8