У меня есть список временных меток, например:
['2018-06-28 20:00:00', '2018-06-28 20:00:05', '2018-06-28 20:00:10', '2018-06-28 20:00:15', '2018-06-28 20:00:20', '2018-06-28 20:05:30']
Я рисую график таким образом, где timestamp и iops - это список, например:
p1, = host.plot(timestamp[0:], iops[0:], "b-", label="IOPS")
Я установил x_lim как:
host.set_xlim([timestamp[0],timestamp[-1]])
Это то, что я сделал, чтобы показать временную метку по оси x:
_fmt = mdates.DateFormatter('%Y-%m-%d')
_fmt.format_data_short = lambda pos: mdates.num2date(pos).strftime("%Y-%m-%d; %H:%M:%S")
host.xaxis.set_major_formatter(_fmt)
Полное сообщение об ошибке читается
ValueError: DateFormatter обнаружил значение x = 0, что является незаконной датой. Обычно это происходит из-за того, что вы не указали оси, что это график даты, например, с ax.xaxis_date()
И это действительно так, потому что вы замышляете строки здесь, и matplotlib не может знать, что они несут в себе значение как "дата" для вас.
Решение состоит в том, чтобы преобразовать их в даты.
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
timestamp= ['2018-06-28 20:00:00', '2018-06-28 20:00:05', '2018-06-28 20:00:10',
'2018-06-28 20:00:15', '2018-06-28 20:00:20', '2018-06-28 20:05:30']
dates = [datetime.strptime(t, "%Y-%m-%d %H:%M:%S") for t in timestamp]
y = list(range(6))
fig, ax = plt.subplots()
p1, = ax.plot(dates, y, "b-", label="IOPS")
ax.set_xlim([dates[0],dates[-1]])
_fmt = mdates.DateFormatter('%Y-%m-%d')
_fmt.format_data_short = lambda pos: mdates.num2date(pos).strftime("%Y-%m-%d; %H:%M:%S")
ax.xaxis.set_major_formatter(_fmt)
plt.show()