Слайдер даты с Plotly Dash не работает - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь создать приложение-приборную панель с ползунком datetime, но следующий код не работает - в URL отображается сообщение «Ошибка загрузки макета». Я делаю что-то глупое или нужны какие-то хитрости для создания слайдера на объектах datetime? Воспроизводимый код следует:

import dash
import dash_core_components as dcc
import dash_html_components as html
import datetime

base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(0, 10)]

app = dash.Dash()

app.layout = html.Div([
    html.Label('Slider'),
    dcc.RangeSlider(min=min(date_list), 
                    max=max(date_list), 
                    value=min(date_list))
    ])

if __name__ == '__main__':
    app.run_server()

Ответы [ 3 ]

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

Какие у вас индексные единицы? Дата / время панд или просто цифры?

Я попытался немного отладить:

app.layout = html.Div([dcc.RangeSlider(id='my-slider',
                                       min=1,
                                       max=5,
                                       step=1,
                                       # value=2,
                                       ),
                       html.H1(id='product')])

Оказывается, что если я установлю значение (поэтому раскомментируем value=2), оно сломается. Было бы хорошо, если бы вы могли попробовать без аргумента value.

EDIT: Аргумент value должен быть списком (диапазон ...). Установка value=[2,3] работает. Это может решить вашу проблему.

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

Plotly-Dash в настоящее время не поддерживает объекты даты и времени .

Решение вашей проблемы - описать в моем ответе на другой вопрос Ploly datetime


Одним из возможных решений является использование двух разных аргументов при инициализации:

  • значение
  • знаки

Пример использования панд для генерации метки времени:

Необходимый импорт:

import pandas as pd
import time

Некоторые необходимые функции:

daterange = pd.date_range(start='2017',end='2018',freq='W')

def unixTimeMillis(dt):
    ''' Convert datetime to unix timestamp '''
    return int(time.mktime(dt.timetuple()))

def unixToDatetime(unix):
    ''' Convert unix timestamp to datetime. '''
    return pd.to_datetime(unix,unit='s')

def getMarks(start, end, Nth=100):
    ''' Returns the marks for labeling. 
        Every Nth value will be used.
    '''

    result = {}
    for i, date in enumerate(daterange):
        if(i%Nth == 1):
            # Append value to dict
            result[unixTimeMillis(date)] = str(date.strftime('%Y-%m-%d'))

    return result

Для объекта RangeSlider вы можете инициализировать его следующим образом:

dcc.RangeSlider(
                id='year_slider',
                min = unixTimeMillis(daterange.min()),
                max = unixTimeMillis(daterange.max()),
                value = [unixTimeMillis(daterange.min()),
                         unixTimeMillis(daterange.max())],
                marks=getMarks(daterange.min(),
                            daterange.max())
            )
0 голосов
/ 27 июня 2018

Глядя на документацию, почему бы не попробовать просто обычный слайдер dcc.Slider. Вы можете проверить пример внизу документации: https://dash.plot.ly/getting-started#dash-app-layout.

РЕДАКТИРОВАТЬ: Добавлен пример кода из документации.

Вы можете добавить это как элемент в ваш список, hmtl.Div.
html.Label('Slider'),
    dcc.Slider(
        min=0,
        max=9,
        marks={i: 'Label {}'.format(i) if i == 1 else str(i) for i in range(1, 6)},
        value=5,
    ),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...