ValueError: минимальный предел просмотра -5.1000000000000005 меньше 1 и является недопустимым значением даты Matplotlib - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть 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.

1 Ответ

0 голосов
/ 06 февраля 2019

Для тех, кто заинтересован, вот как я закончил черчение данных с помощью matplotlib

# Plot cpu
plt.figure(1)
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)
plt.title(f'CPU usage on {remote_host}')
lines = plt.plot(dates, cpu_data[cpu_data.columns[2:]])
ax.legend(lines, [str(col) for col in list(cpu_data.columns[2:])])
plot.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...