Ответ 1
Можно вызвать 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 objects → 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()