带日期滑块的iPyWidget?

2024-06-07 17:52:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有一个简单的方法来建立一个带有日期时间滑块的iPyWidget。现在很容易在整数或浮点范围(例如数字1-10、小数0.01、0.02,…)上滑动。

我想您可以将日期转换为浮点数或整数,使用它们构建某种滑块,然后将滑块上的显示标签转换回日期。然而,这看起来很笨拙。有没有人有更顺畅的解决方案?


Tags: 方法时间数字整数标签解决方案浮点滑块
2条回答

名为SelectionRangeSlider的通用范围滑块小部件已添加到May 2017中的ipywidgets。此滑块可用于所有类型的数据,包括日期。

下面的代码示例创建一个范围滑块,允许用户选择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

Date range slider with full month selection

Date range slider with partial month selection

这个滑块可以很容易地与ipywidgets的interact功能结合起来。在这种情况下,小部件返回一个由选定的上下范围组成的元组。

def print_date_range(date_range):
    print(date_range)

widgets.interact(
    print_date_range,
    date_range=selection_range_slider
);

先前选定范围的两个输出:

(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'))

我最近也有同样的问题。我不得不自己写一个类来做一个日期范围选择器。这是我的代码:

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()

享受;-)

相关问题 更多 >

    热门问题