iPyWidget с ползунком даты с виджетом / анимацией воспроизведения? - PullRequest
0 голосов
/ 29 апреля 2020

на основе this Я сделал один слайдер даты и теперь хотел сделать шаг go дальше и анимировать его с помощью виджета воспроизведения. К сожалению, виджет воспроизведения, похоже, не принимает значения дня, и теперь я хотел спросить, есть ли более простой способ, чем присвоить каждой дате значение Int с помощью другой функции?

from datetime import datetime

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(
            options=options,
            continuous_update=False
        )

        self.slider_start.on_trait_change(self.slider_start_changed, 'value')

        self.widget = widgets.Box(children=[self.slider_start])

    def slider_start_changed(self,key,value):
        self._observe(start=self.slider_start.value)

    def display(self):
        display(self.slider_start)

    def _observe(self,**kwargs):
        if hasattr(self,'observe'):
            self.observe(**kwargs)

def fct(start):
    print(start)

#date1 = DateRangePicker(start='2020-02-17',end="2020-03-27",freq='D',fmt='%Y-%m-%d')

#date1.observe=fct

#date1.display()

start_date = datetime(2020, 2, 17)
end_date = datetime(2020, 3, 27)
dates = pd.date_range(start_date, end_date, freq='D')
date = [(date.strftime(' %d %b %Y '), date) for date in dates]

date_slider = widgets.SelectionSlider(
    options=date,
    orientation='horizontal',
    layout={'width': 'flex'}
)

date_slider

play = widgets.Play(
    value=start_date,
    min=start_date,
    max=end_date,
    step=1,
    interval=500,
    description="Press play",
    disabled=False
)

widgets.jslink((play, 'value'), (date_slider, 'value'))
widgets.HBox([play, date_slider])
...