Plotly Dash 的日期滑块不起作用
Date slider with Plotly Dash does not work
我正在尝试构建带有日期时间滑块的破折号应用程序,但以下代码不起作用 - url 显示 "Error loading layout"。我是在做一些愚蠢的事情,还是在日期时间对象上构建滑块需要任何技巧?可重现的代码如下:
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()
查看文档,为什么不尝试使用常规滑块 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,
),
你们的指数单位是什么? Pandas' 日期时间还是简单的数字?
我试着做了一些调试:
app.layout = html.Div([dcc.RangeSlider(id='my-slider',
min=1,
max=5,
step=1,
# value=2,
),
html.H1(id='product')])
事实证明,如果我设置该值(因此取消注释 value=2
),它就会中断。
如果您可以不使用 value
参数进行尝试,那就太好了。
编辑:
value
参数需要是一个列表(范围...)。设置 value=[2,3]
有效。这可能会解决您的问题。
Plotly-Dash 目前不支持日期时间对象。
我对另一个问题的回答中描述了您问题的解决方案 Ploly datetime
一种可能的解决方案是在初始化时使用两个不同的参数:
- 价值
- 标记
使用 pandas 生成时间戳的示例:
需要导入:
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())
)
这应该绝对有效,并且比任何其他解决方案都容易得多
marks = {int(i):str(j) for i,j in zip(range(len(df.years)), df[“years”])}
然后您可以在函数回调中模仿相同的操作,通过字典键更新值。
只是附加组件。
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
from datetime import datetime, timedelta, datetime, date
dates = ['03-02-2021', '03-03-2021', '03-04-2021', '03-05-2021', '03-06-2021', '03-07-2021']
mytotaldates = {i:datetime.strptime(x, "%m-%d-%Y").date() for i,x in enumerate(dates)}
a = (list(mytotaldates.keys()))
app = dash.Dash()
app.layout = html.Div(children=[
dcc.Slider(
id='Dateslider',
min=a[0],
max=a[-1],
marks=mytotaldates,
value=a[-1],
),
html.Div(id='OutputContainer')
])
@app.callback(
Output('OutputContainer', 'children'),
[Input('Dateslider', 'value')])
def rangerselection(val):
val = mytotaldates[val]
return f'Selected Date: {val}'
if __name__ == '__main__':
app.run_server(debug=False, use_reloader=True)
我正在尝试构建带有日期时间滑块的破折号应用程序,但以下代码不起作用 - url 显示 "Error loading layout"。我是在做一些愚蠢的事情,还是在日期时间对象上构建滑块需要任何技巧?可重现的代码如下:
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()
查看文档,为什么不尝试使用常规滑块 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,
),
你们的指数单位是什么? Pandas' 日期时间还是简单的数字?
我试着做了一些调试:
app.layout = html.Div([dcc.RangeSlider(id='my-slider',
min=1,
max=5,
step=1,
# value=2,
),
html.H1(id='product')])
事实证明,如果我设置该值(因此取消注释 value=2
),它就会中断。
如果您可以不使用 value
参数进行尝试,那就太好了。
编辑:
value
参数需要是一个列表(范围...)。设置 value=[2,3]
有效。这可能会解决您的问题。
Plotly-Dash 目前不支持日期时间对象。
我对另一个问题的回答中描述了您问题的解决方案 Ploly datetime
一种可能的解决方案是在初始化时使用两个不同的参数:
- 价值
- 标记
使用 pandas 生成时间戳的示例:
需要导入:
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())
)
这应该绝对有效,并且比任何其他解决方案都容易得多
marks = {int(i):str(j) for i,j in zip(range(len(df.years)), df[“years”])}
然后您可以在函数回调中模仿相同的操作,通过字典键更新值。
只是附加组件。
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
from datetime import datetime, timedelta, datetime, date
dates = ['03-02-2021', '03-03-2021', '03-04-2021', '03-05-2021', '03-06-2021', '03-07-2021']
mytotaldates = {i:datetime.strptime(x, "%m-%d-%Y").date() for i,x in enumerate(dates)}
a = (list(mytotaldates.keys()))
app = dash.Dash()
app.layout = html.Div(children=[
dcc.Slider(
id='Dateslider',
min=a[0],
max=a[-1],
marks=mytotaldates,
value=a[-1],
),
html.Div(id='OutputContainer')
])
@app.callback(
Output('OutputContainer', 'children'),
[Input('Dateslider', 'value')])
def rangerselection(val):
val = mytotaldates[val]
return f'Selected Date: {val}'
if __name__ == '__main__':
app.run_server(debug=False, use_reloader=True)