Plotly: как отобразить на рисунке только сегодняшние данные?

#python #pandas #datetime #plotly

#python #pandas #дата и время #plotly

Вопрос:

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

Вот код, который я использовал для создания этих графиков :

 fi& = &o.Fi&ure()
fi& = make_subplots(rows=2,cols=1,shared_xaxes=True,vertical_spacin&=0.02)
fi&.add_trace(&o.Scatter(x=data['time'],y=data['x_last_recorded'],name='xyz',mode='lines markers'),row=2,col=1)
fi&.add_trace(&o.Scatter(x=predict_data['time'],y=predict_data['x1_last_recorded'],name='x1yz',mode='lines'),row=2,col=1)

fi&.update_layout(hei&ht=800,width=1500,title='first_&raph',yaxis_title='Values')
  

Это дало мне график того, как я хочу, но он показывает все даты, присутствующие во фрейме данных. Как мне получить только данные текущей даты?
Структура времени : дд-мм-гггг чч: мм

Ответ №1:

Мы можем решить вашу проблему, установив в вашем фрейме данных подмножество, используя такой подход, как df_current = df[df.index.date==df.index.date[-1]] , а затем изменив стиль вашего рисунка, разрешив разным подмножествам быть представленными разными опциями в выпадающем меню.

Вот результирующий рисунок для различных подмножеств / параметров выбора:

Все даты

Текущая дата

Полный код:

 # imports
import plotly.&raph_objects as &o
import pandas as pd
import numpy as np

# sample data in the form of an hourlt
np.random.seed(1234)
tseries = pd.date_ran&e("01.01.2020", "01.04.2020", freq="H")
data = np.random.randint(-10, 12, size=(len(tseries), 2))
df = pd.DataFrame(index=tseries, data=data)
df.drop(df.tail(1).index,inplace=True)
df.columns=list('AB')
df.iloc[0]=0
df=df.cumsum()

# subset method
df_current = df[df.index.date==df.index.date[-1]]

# plotly setup
fi& = &o.Fi&ure()

# set up a trace for each column in a dataframe
for col in df.columns:
    fi&.add_trace(&o.Scatter(x=df.index, y =df[col], name=col))

# container for updatemenus and buttons
updatemenu = []
buttons = []

# button 1
buttons.append(dict(method='restyle',
                    label='All',
                    visible=True,
                    ar&s=[{'y':[df[col].values for col in df.columns],
                           'x':[df.index],
                           'type':'scatter'}, ],))
# button 2
buttons.append(dict(method='restyle',
                    label='Current',
                    visible=True,
                    ar&s=[{'y':[df_current[col].values for col in df_current.columns],
                           'x':[df_current.index],
                           'type':'scatter'}, ],))

# menu setup
your_menu = dict()
updatemenu.append(your_menu)

updatemenu.append(your_menu)
updatemenu[0]['buttons'] = buttons
updatemenu[0]['direction'] = 'down'
updatemenu[0]['showactive'] = True

# add dropdown menus to the fi&ure
fi&.update_layout(showle&end=False, updatemenus=updatemenu)
fi&.show()
  

Комментарии:

1. Это отличная идея @vestland. Я попробую это сделать и отмечу ваш ответ 🙂 Спасибо за вашу помощь!!