首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用纯Dash的日期滑块不起作用

使用纯Dash的日期滑块不起作用
EN

Stack Overflow用户
提问于 2018-06-27 12:46:54
回答 5查看 10.4K关注 0票数 9

我正在尝试用datetime滑块构建一个破折号应用程序,但是下面的代码不起作用-- url显示“错误加载布局”。我是在做一些愚蠢的事情,还是在datetime对象上构建滑块所需的任何技巧?可复制代码如下:

代码语言:javascript
复制
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()
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-06-29 10:00:15

实际上-Dash目前不支持日期时间对象()。

您的问题的解决方案是在我对另一个问题Plotly datetime的回答中描述

一个可能的解决方案是在初始化时使用两个不同的参数:

  • 价值
  • 标记

例如,使用熊猫生成时间戳:

所需进口品:

代码语言:javascript
复制
import pandas as pd
import time

一些必要的职能:

代码语言:javascript
复制
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对象,可以像这样初始化它:

代码语言:javascript
复制
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())
            )
票数 15
EN

Stack Overflow用户

发布于 2020-02-04 20:07:07

这肯定会奏效,而且比任何其他解决方案都容易得多。

代码语言:javascript
复制
marks = {int(i):str(j) for i,j in zip(range(len(df.years)), df[“years”])}

然后,您可以在函数回调中模仿相同的内容,通过字典键更新值。

票数 2
EN

Stack Overflow用户

发布于 2018-06-27 12:56:11

看看文档,为什么不尝试一下常规滑块dcc.Slider。您可以检查文档底部的示例:https://dash.plot.ly/getting-started#dash-app-layout

编辑:从文档中添加代码示例。

您可以将其作为元素添加到列表中,hmtl.Div

代码语言:javascript
复制
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,
    ),
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51063191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档