带有日期滑块的 iPyWidget?
iPyWidget with date slider?
我想知道是否有一种简单的方法来构建带有日期时间滑块的 iPyWidget。现在很容易滑过整数或浮点数范围(例如数字 1-10,小数 0.01、0.02,...)。
我想您可以将日期转换为浮点数或整数,使用它们构建某种滑块,然后转换回滑块上显示标签的日期。然而,这似乎很笨拙。有没有人有更流畅的解决方案?
我最近遇到了同样的问题。我必须自己编写 class 来做日期范围选择器。这是我的代码:
import pandas as pd
import ipywidgets as widgets
from IPython.display import display
class DateRangePicker(object):
def __init__(self,start,end,freq='D',fmt='%Y-%m-%d'):
"""
Parameters
----------
start : string or datetime-like
Left bound of the period
end : string or datetime-like
Left bound of the period
freq : string or pandas.DateOffset, default='D'
Frequency strings can have multiples, e.g. '5H'
fmt : string, defauly = '%Y-%m-%d'
Format to use to display the selected period
"""
self.date_range=pd.date_range(start=start,end=end,freq=freq)
options = [(item.strftime(fmt),item) for item in self.date_range]
self.slider_start = widgets.SelectionSlider(
description='start',
options=options,
continuous_update=False
)
self.slider_end = widgets.SelectionSlider(
description='end',
options=options,
continuous_update=False,
value=options[-1][1]
)
self.slider_start.on_trait_change(self.slider_start_changed, 'value')
self.slider_end.on_trait_change(self.slider_end_changed, 'value')
self.widget = widgets.Box(children=[self.slider_start,self.slider_end])
def slider_start_changed(self,key,value):
self.slider_end.value=max(self.slider_start.value,self.slider_end.value)
self._observe(start=self.slider_start.value,end=self.slider_end.value)
def slider_end_changed(self,key,value):
self.slider_start.value=min(self.slider_start.value,self.slider_end.value)
self._observe(start=self.slider_start.value,end=self.slider_end.value)
def display(self):
display(self.slider_start,self.slider_end)
def _observe(self,**kwargs):
if hasattr(self,'observe'):
self.observe(**kwargs)
def fct(start,end):
print start,end
使用起来比较简单:
w=DateRangePicker(start='2016-08-02',end="2016-09-02",freq='D',fmt='%Y-%m-%d')
w.observe=fct
w.display()
尽情享受 ;-)
一个名为 SelectionRangeSlider
的通用范围滑块小部件已添加到 May 2017 中的 ipywidgets。此滑块可用于各种数据,包括日期。
下面的代码示例创建了一个范围滑块,允许用户select 4 月 24 日到 5 月 24 日之间的日期范围。
import ipywidgets as widgets
import pandas as pd
from datetime import datetime
start_date = datetime(2018, 4, 24)
end_date = datetime(2018, 5, 24)
dates = pd.date_range(start_date, end_date, freq='D')
options = [(date.strftime(' %d %b %Y '), date) for date in dates]
index = (0, len(options)-1)
selection_range_slider = widgets.SelectionRangeSlider(
options=options,
index=index,
description='Dates',
orientation='horizontal',
layout={'width': '500px'}
)
selection_range_slider
此滑块可轻松与 ipywidgets 的 interact
功能结合使用。在那种情况下,小部件 returns 一个由 selected 上限和下限组成的元组。
def print_date_range(date_range):
print(date_range)
widgets.interact(
print_date_range,
date_range=selection_range_slider
);
先前 selected 范围的两个输出:
(Timestamp('2018-04-24 00:00:00', freq='D'), Timestamp('2018-05-24 00:00:00', freq='D'))
(Timestamp('2018-04-30 00:00:00', freq='D'), Timestamp('2018-05-18 00:00:00', freq='D'))
我想知道是否有一种简单的方法来构建带有日期时间滑块的 iPyWidget。现在很容易滑过整数或浮点数范围(例如数字 1-10,小数 0.01、0.02,...)。
我想您可以将日期转换为浮点数或整数,使用它们构建某种滑块,然后转换回滑块上显示标签的日期。然而,这似乎很笨拙。有没有人有更流畅的解决方案?
我最近遇到了同样的问题。我必须自己编写 class 来做日期范围选择器。这是我的代码:
import pandas as pd
import ipywidgets as widgets
from IPython.display import display
class DateRangePicker(object):
def __init__(self,start,end,freq='D',fmt='%Y-%m-%d'):
"""
Parameters
----------
start : string or datetime-like
Left bound of the period
end : string or datetime-like
Left bound of the period
freq : string or pandas.DateOffset, default='D'
Frequency strings can have multiples, e.g. '5H'
fmt : string, defauly = '%Y-%m-%d'
Format to use to display the selected period
"""
self.date_range=pd.date_range(start=start,end=end,freq=freq)
options = [(item.strftime(fmt),item) for item in self.date_range]
self.slider_start = widgets.SelectionSlider(
description='start',
options=options,
continuous_update=False
)
self.slider_end = widgets.SelectionSlider(
description='end',
options=options,
continuous_update=False,
value=options[-1][1]
)
self.slider_start.on_trait_change(self.slider_start_changed, 'value')
self.slider_end.on_trait_change(self.slider_end_changed, 'value')
self.widget = widgets.Box(children=[self.slider_start,self.slider_end])
def slider_start_changed(self,key,value):
self.slider_end.value=max(self.slider_start.value,self.slider_end.value)
self._observe(start=self.slider_start.value,end=self.slider_end.value)
def slider_end_changed(self,key,value):
self.slider_start.value=min(self.slider_start.value,self.slider_end.value)
self._observe(start=self.slider_start.value,end=self.slider_end.value)
def display(self):
display(self.slider_start,self.slider_end)
def _observe(self,**kwargs):
if hasattr(self,'observe'):
self.observe(**kwargs)
def fct(start,end):
print start,end
使用起来比较简单:
w=DateRangePicker(start='2016-08-02',end="2016-09-02",freq='D',fmt='%Y-%m-%d')
w.observe=fct
w.display()
尽情享受 ;-)
一个名为 SelectionRangeSlider
的通用范围滑块小部件已添加到 May 2017 中的 ipywidgets。此滑块可用于各种数据,包括日期。
下面的代码示例创建了一个范围滑块,允许用户select 4 月 24 日到 5 月 24 日之间的日期范围。
import ipywidgets as widgets
import pandas as pd
from datetime import datetime
start_date = datetime(2018, 4, 24)
end_date = datetime(2018, 5, 24)
dates = pd.date_range(start_date, end_date, freq='D')
options = [(date.strftime(' %d %b %Y '), date) for date in dates]
index = (0, len(options)-1)
selection_range_slider = widgets.SelectionRangeSlider(
options=options,
index=index,
description='Dates',
orientation='horizontal',
layout={'width': '500px'}
)
selection_range_slider
此滑块可轻松与 ipywidgets 的 interact
功能结合使用。在那种情况下,小部件 returns 一个由 selected 上限和下限组成的元组。
def print_date_range(date_range):
print(date_range)
widgets.interact(
print_date_range,
date_range=selection_range_slider
);
先前 selected 范围的两个输出:
(Timestamp('2018-04-24 00:00:00', freq='D'), Timestamp('2018-05-24 00:00:00', freq='D'))
(Timestamp('2018-04-30 00:00:00', freq='D'), Timestamp('2018-05-18 00:00:00', freq='D'))