У меня есть pandas dataframe, который содержит вывод sar, который я хотел бы отобразить в matplotlib.Пример данных приведен ниже.
>>> cpu_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 70 entries, 0 to 207
Data columns (total 8 columns):
00:00:01 70 non-null datetime64[ns]
CPU 70 non-null object
%user 70 non-null float64
%nice 70 non-null float64
%system 70 non-null float64
%iowait 70 non-null float64
%steal 70 non-null float64
%idle 70 non-null float64
dtypes: float64(6), object(2)
memory usage: 4.4+ KB
>>> cpu_data
00:00:01 CPU %user %nice %system %iowait %steal %idle
0 00:10:01 all 0.30 0.00 0.30 0.06 0.0 99.34
3 00:20:01 all 0.09 0.00 0.13 0.00 0.0 99.78
6 00:30:01 all 0.07 0.00 0.11 0.00 0.0 99.81
9 00:40:01 all 0.08 0.00 0.11 0.00 0.0 99.80
12 00:50:01 all 0.08 0.00 0.13 0.00 0.0 99.79
15 01:00:04 all 0.09 0.00 0.13 0.00 0.0 99.77
18 01:10:01 all 0.27 0.00 0.28 0.00 0.0 99.46
21 01:20:01 all 0.09 0.00 0.11 0.00 0.0 99.79
24 01:30:04 all 0.12 0.00 0.13 0.01 0.0 99.74
27 01:40:01 all 0.08 0.00 0.11 0.01 0.0 99.80
30 01:50:01 all 0.09 0.00 0.13 0.01 0.0 99.77
Я хочу построить график, используя временные метки в качестве оси X.Я написал следующий код.
import pandas as pd
import os
import matplotlib.pyplot as plt
import matplotlib.dates as md
import dateutil
import matplotlib.dates as mdates
cpu_data[cpu_data.columns[0]] = [dateutil.parser.parse(s) for s in cpu_data[cpu_data.columns[0]]]
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
ax.xaxis_date()
xfmt = md.DateFormatter('%H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
cpu_data.plot(ax=ax)
plt.show()
Но я получаю следующую ошибку
ValueError: view limit minimum -5.1000000000000005 is less than 1 and is an invalid Matplotlib date value. This often happens if you pass a non-datetime value to an axis that has datetime units
Это не имеет никакого смысла, потому что я вручную преобразовал все строки меток времени в datetimeобъекты
cpu_data[cpu_data.columns[0]] = [dateutil.parser.parse(s) for s in cpu_data[cpu_data.columns[0]]]
Но они не соответствуют типу данных
2018-09-30 00:10:01 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
2018-09-30 00:20:01 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
2018-09-30 00:30:01 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
2018-09-30 00:40:01 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
2018-09-30 00:50:01 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
2018-09-30 01:00:01 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
Я понятия не имею, как это исправить.Я попытался вручную установить ось X для запуска на объекте datetime со значением plt.xlim(cpu_data[cpu_data.columns[0]].iloc[0])
, но это выдает ту же ошибку.Я действительно потерян здесь.Любое руководство будет оценено.Я могу предоставить больше информации, если это поможет.
РЕДАКТИРОВАТЬ:
Я думаю, что даты не правильный тип данных (как указано в ошибке).Похоже, что pandas продолжает преобразовывать данные в столбце времени (столбец 0) в объект типа pandas._libs.tslibs.timestamps.Timestamp
.Я думаю, что это должен быть объект datetime, на что жалуется matplotlib.