Нарисуйте прямоугольники в Matplotlib с данными даты и времени - PullRequest
0 голосов
/ 29 июня 2018

У меня следующая проблема: у меня есть фрейм данных с индексом даты и времени и столбцами, которые содержат значения с плавающей запятой или логические значения, например:

                     TAG_2552  TAG_2526
timestamp
2018-06-17 14:41:48      50.0      True
2018-06-17 14:41:49      51.0      True
2018-06-17 14:41:50      52.0      True
2018-06-17 14:41:51      49.0      True
2018-06-17 14:41:52      55.0      False
2018-06-17 14:41:53      50.0      False
2018-06-17 14:41:54      48.0      False
2018-06-17 14:41:55      54.0      False
2018-06-17 14:41:56      53.0      True
2018-06-17 14:41:57      50.0      True

Я хотел бы построить это, что не является проблемой для значений с плавающей запятой. Для логических значений я хотел бы рисовать прямоугольники, когда они True. Я попытался использовать matplotlib.collections для этого.

Я пытался

df['datetime']=df.index
collection = collections.BrokenBarHCollection.span_where(df['datetime'].dt.date, ymin=0, ymax=1, where=df['TAG_2526']==True, facecolor='green', alpha=.5)

(и другие варианты), но это не сработало.

Можно создать коллекцию, используя

df['timedelta'] = df['datetime']-df['datetime'][0]
collection2 = collections.BrokenBarHCollection.span_where(myProc9['timedelta'].astype('timedelta64[ns]')/np.timedelta64(1,'s'), ymin=0, ymax=1, where=myProc9['TAG_2503']==True, facecolor='green', alpha=.5)

Но так как я хотел бы провести сравнение с исходной датой-временем, потому что я хотел бы разделить ось X, то единственный вариант, который я могу видеть, - это построить все относительно myProc9['timedelta'].astype('timedelta64[ns]')/np.timedelta64(1,'s') и перемаркировать ось X.

Я проверил разные страницы об изменении формата datetime, но matplotlib.collections, похоже, ничего не берет, обычное сообщение об ошибке

TypeError: float() argument must be a string or a number, not 'datetime.date'

(или что-то еще, что я пробовал, для различных преобразований между форматами даты и времени см. Здесь: Преобразование между датой и временем, меткой времени и датой и временем64 )

Мне было интересно, есть ли лучший способ сделать это (не использовать matplotlib.collections) или другой способ назвать это?

1 Ответ

0 голосов
/ 29 июня 2018

Я собирался удалить вопрос, но, возможно, он когда-нибудь пригодится.

ax.fill_between(df.index, 0,1,where=df['TAG_2526'])

делает свою работу и выглядит довольно щедро в отношении отметок времени.

Ссылка: https://matplotlib.org/gallery/pyplots/whats_new_98_4_fill_between.html#sphx-glr-gallery-pyplots-whats-new-98-4-fill-between-py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...