Подтвердить что ты не робот

Построение временных меток unix в matplotlib

Я хотел бы создать общий график -vs-time с модулем matplotlib python. Мои времена находятся в unix-времени, но я бы хотел, чтобы они отображались в удобочитаемом формате на графике x-axis.

Я прочитал ответы о построении с объектами datetime, но этот метод, кажется, удаляет информацию о часах/мин/сек и отметках времени рельсов на весь день. Есть ли способ генерировать эти графики и показывать более гранулированные метки?

4b9b3361

Ответ 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()

alt text

тогда вы получите красиво отформатированные даты, но все 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()

alt text