Построение двух временных рядов данных на одном графике с различной выборкой (и с использованием двойной оси Y) - PullRequest
0 голосов
/ 29 апреля 2020

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

                  Temp [Degrees_C]  Cond [mS/cm]    
yyyy-mm-ddThh:mm:ss.sss             
2020-01-28 03:00:59 14.553947   19.301285   
2020-01-28 08:00:59 14.501740   19.310037   
2020-01-28 13:00:59 14.425415   18.531609   
2020-01-28 18:00:59 14.414717   16.155998   
...

И это:

                    CONDUCTIVITY    Temp [C]
DATE TIME           
2020-01-28 03:00:00     18.240  15.761111
2020-01-28 04:00:00     18.147  15.722222
2020-01-28 05:00:00     17.930  15.722222
2020-01-28 06:00:00     17.873  15.666667
...

Я хочу создать один график, используя эти два набора данных, они должны совместно использовать один и тот же ось х в качестве даты-времени и две разные оси у (одна для температуры и одна для проводимости). Однако, поскольку выборка для них обоих различна, я не уверен, как это сделать.

Есть предложения?

Спасибо !!

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Чтобы получить даты, совпадающие между двумя наборами данных, я бы использовал pd.DateOffset. В качестве альтернативы вы можете использовать dt.round, но это может привести к некоторым проблемам, если вы не уверены, что округление будет работать.

Чтобы построить две оси Y, вы ищете ax.twinx

import pandas as pd
from io import StringIO

str1 = """
2020-01-28 03:00:59, 14.553947,   19.301285   
2020-01-28 08:00:59, 14.501740,   19.310037   
2020-01-28 13:00:59, 14.425415,   18.531609   
2020-01-28 18:00:59, 14.414717,   16.155998   
"""


str2="""
2020-01-28 03:00:00,     18.240,  15.761111
2020-01-28 04:00:00,    18.147,  15.722222
2020-01-28 05:00:00,     17.930,  15.722222
2020-01-28 06:00:00,     17.873,  15.666667
"""

colnames1 = ['date','cond','temp']
colnames2 = ['date','temp', 'cond']
df1 = pd.read_csv(StringIO(str1), header=None, names = colnames1, parse_dates=['date'])
df2 = pd.read_csv(StringIO(str2), header=None, names = colnames2, parse_dates=['date'])

#Offset to even seconds
df1.date = df1.date - pd.DateOffset(seconds=59)

#plot
ax = df1.plot(x='date',y='temp', label='df1', color='k', ls = '--')

#Create second y axis
ax_tw = ax.twinx()
df1.plot(x='date',y='cond', ax = ax_tw, label='df1', color='k', ls='-')
df2.plot(x='date',y='temp', ax= ax, label='df2', color='red', ls='--')
df2.plot(x='date',y='cond', ax = ax_tw,label='df2', color='red', ls ='-')
ax.legend()

, который возвращает:

enter image description here

0 голосов
/ 29 апреля 2020

На этой странице документации matplotlib показан простой пример построения графика с двойной осью y: https://matplotlib.org/gallery/api/two_scales.html

Вы написали, что у вас есть фреймы данных, которые звучат так, как вы используете pandas для обработки данных. Вы можете просто преобразовать свои данные в numpy массивы и следовать примеру.

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