Нарисуйте две трассы от двух разных дней до одного графика на основе оси X - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь отобразить данные в одном линейном графике с двумя трассами, где по оси x будет время с 00:00:00 до 23:59:59, по оси y 'down_speed' и каждая трасса будет отображать данные за один день. Например, Trace1 от 27 апреля (00:43:02, 03:43:30, 08:44:13, 18:01:12, 23:32:02) и Trace2 от 28 апреля (03:02:29, 09 : 03: 07, 18:03:56, 23:04:40).

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

    id             time         down_speed  
     1    2020-04-27 00:43:02     4,807  
     2    2020-04-27 03:43:30     5,046  
     3    2020-04-27 08:44:13     2,12  
     4    2020-04-27 18:01:12     4,065  
     5    2020-04-27 23:32:02     4,558  
     6    2020-04-28 03:02:29     4,803
     7    2020-04-28 09:03:07     3,967
     8    2020-04-28 18:03:56     3,617
     9    2020-04-28 23:04:40     5,703

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

import pandas as pd
import plotly.express as px
import plotly.offline as py

df  = pd.read_csv('my_file.csv',parse_dates=['time']);

#plot all data between two times
mask = (df['time'] > '2020-04-27 00:00:00') & (df['time'] <= '2020-04-27 23:59:59')
fig = px.line(df.loc[mask], x = 'time', y = 'speed_download')
py.plot(fig)

Я читаю документацию к pandas временным рядам, но я не нашел ничего, что будет работать, любая идея, прежде чем я начну делать какое-то решение грубой силы?

1 Ответ

0 голосов
/ 29 апреля 2020
import pandas as pd
import plotly.graph_objects as go

df = pd.DataFrame({'time': {1: '2020-04-27 00:43:02', 2: '2020-04-27 03:43:30', 3: '2020-04-27 08:44:13', 4: '2020-04-27 18:01:12', 5: '2020-04-27 23:32:02', 6: '2020-04-28 03:02:29', 7: '2020-04-28 09:03:07', 8: '2020-04-28 18:03:56', 9: '2020-04-28 23:04:40'},
                   'down_speed': {1: 4807, 2: 5046, 3: 2120, 4: 4065, 5: 4558, 6: 4803, 7: 3967, 8: 3617, 9: 5703}})

df['date'] = pd.to_datetime(df['time']).dt.date
df['time'] = pd.to_datetime(df['time']).apply(lambda x: x.replace(year=1990, month=1, day=1))

# extract the list of dates
dates = list(df['date'].sort_values().unique())

# generate the traces for the first date
df1 = df[df['date'] == dates[0]]

data = [go.Scatter(x=list(df1['time']),
                   y=list(df1['down_speed']),
                   name=str(dates[0]),
                   mode='markers+lines')]

# add the traces for the subsequent dates
for date in dates[1:]:

    df1 = df[df['date'] == date]

    data.append(go.Scatter(x=list(df1['time']),
                           y=list(df1['down_speed']),
                           name=str(date),
                           mode='markers+lines'))

# define the figure layout
layout = dict(xaxis=dict(range=[df1['time'].min(), df1['time'].max()],
                         tickformat='%H:%M:%S',
                         type='date',
                         autorange=False))

fig = go.Figure(data=data, layout=layout)

fig.show()

enter image description here

...