Можно вызвать plt.plot(dates,values)
с dates
, являющимся списком datetime.datetime
объектов. Сюжет будет включать в себя xticks в формате, подобном '%Y-%m-%d'
, и при увеличении автоматически меняется на тот, который показывает часы, минуты, секунды.
Однако, похоже, что вы желаете большего контроля, чем этот. Возможно, он не показывает часы, минуты, секунды на желаемой шкале.
В этом случае вы можете настроить собственный форматер даты:
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
К сожалению, если вы передаете datetime.datetime
объекты в plt.plot
, у xticks, автоматически выбираемых matplotlib, кажется, всегда есть секунды, равные нулю. Например, если вы запустите
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time
n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(dates,values)
plt.show()
тогда вы получите красиво отформатированные даты, но все xtick секунды равны нулю.
Так в чем же решение?
Если вы конвертируете свои временные метки -> объекты datetime.datetime -> matplotlib datenums самостоятельно и передадите даты в plt.plot
, то секунды будут сохранены.
PS. Под «matplotlib datenum» я подразумеваю вид числа, возвращаемого matplotlib.dates.date2num
.
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time
n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
datenums=md.date2num(dates)
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(datenums,values)
plt.show()