Skip to content

Commit

Permalink
Add DatetimeRangeSlider
Browse files Browse the repository at this point in the history
  • Loading branch information
philippjfr committed May 23, 2022
1 parent c00f5c1 commit 8b56f2b
Show file tree
Hide file tree
Showing 4 changed files with 149 additions and 5 deletions.
3 changes: 2 additions & 1 deletion examples/reference/widgets/DateRangeSlider.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
"\n",
"* **``start``** (datetime): The range's lower bound\n",
"* **``end``** (datetime): The range's upper bound\n",
"* **``step``** (int): Step in milliseconds\n",
"* **``value``** (tuple): Tuple of upper and lower bounds of the selected range expressed as datetime types\n",
"* **``value_throttled``** (tuple): Tuple of upper and lower bounds of the selected range expressed as datetime types throttled until mouseup\n",
"\n",
Expand Down Expand Up @@ -57,7 +58,7 @@
"date_range_slider = pn.widgets.DateRangeSlider(\n",
" name='Date Range Slider',\n",
" start=dt.datetime(2017, 1, 1), end=dt.datetime(2019, 1, 1),\n",
" value=(dt.datetime(2017, 1, 1), dt.datetime(2018, 1, 10))\n",
" value=(dt.datetime(2017, 1, 1), dt.datetime(2018, 1, 10)),\n",
")\n",
"\n",
"date_range_slider"
Expand Down
111 changes: 111 additions & 0 deletions examples/reference/widgets/DatetimeRangeSlider.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import datetime as dt\n",
"import panel as pn\n",
"\n",
"pn.extension()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The ``DateRangeSlider`` widget allows selecting a date range using a slider with two handles.\n",
"\n",
"For more information about listening to widget events and laying out widgets refer to the [widgets user guide](../../user_guide/Widgets.ipynb). Alternatively you can learn how to build GUIs by declaring parameters independently of any specific widgets in the [param user guide](../../user_guide/Param.ipynb). To express interactivity entirely using Javascript without the need for a Python server take a look at the [links user guide](../../user_guide/Param.ipynb).\n",
"\n",
"#### Parameters:\n",
"\n",
"For layout and styling related parameters see the [customization user guide](../../user_guide/Customization.ipynb).\n",
"\n",
"\n",
"##### Core\n",
"\n",
"* **``start``** (datetime): The range's lower bound\n",
"* **``end``** (datetime): The range's upper bound\n",
"* **``step``** (int): Step in milliseconds\n",
"* **``value``** (tuple): Tuple of upper and lower bounds of the selected range expressed as datetime types\n",
"* **``value_throttled``** (tuple): Tuple of upper and lower bounds of the selected range expressed as datetime types throttled until mouseup\n",
"\n",
"##### Display\n",
"\n",
"* **``bar_color``** (color): Color of the slider bar as a hexadecimal RGB value\n",
"* **``callback_policy``** (str, **DEPRECATED**): Policy to determine when slider events are triggered (one of 'continuous', 'throttle', 'mouseup')\n",
"* **``callback_throttle``** (int): Number of milliseconds to pause between callback calls as the slider is moved\n",
"* **``direction``** (str): Whether the slider should go from left to right ('ltr') or right to left ('rtl')\n",
"* **``disabled``** (boolean): Whether the widget is editable\n",
"* **``name``** (str): The title of the widget\n",
"* **``orientation``** (str): Whether the slider should be displayed in a 'horizontal' or 'vertical' orientation.\n",
"* **``tooltips``** (boolean): Whether to display tooltips on the slider handle\n",
"\n",
"___\n",
"\n",
"The slider start and end can be adjusted by dragging the handles and whole range can be shifted by dragging the selected range."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"datetime_range_slider = pn.widgets.DatetimeRangeSlider(\n",
" name='Datetime Range Slider',\n",
" start=dt.datetime(2017, 1, 1), end=dt.datetime(2019, 1, 1),\n",
" value=(dt.datetime(2017, 1, 1), dt.datetime(2018, 1, 10)),\n",
" step=10000\n",
")\n",
"\n",
"datetime_range_slider"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"``DatetimeRangeSlider.value`` returns a tuple of datetime values that can be read out and set like other widgets:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"datetime_range_slider.value"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Controls\n",
"\n",
"The `DatetimeRangeSlider` widget exposes a number of options which can be changed from both Python and Javascript. Try out the effect of these parameters interactively:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pn.Row(datetime_range_slider.controls(jslink=True), datetime_range_slider)"
]
}
],
"metadata": {
"language_info": {
"name": "python",
"pygments_lexer": "ipython3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
9 changes: 5 additions & 4 deletions panel/widgets/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,9 @@
from .misc import FileDownload, JSONEditor, VideoStream # noqa
from .player import DiscretePlayer, Player # noqa
from .slider import ( # noqa
DateSlider, DateRangeSlider, DiscreteSlider, EditableRangeSlider,
EditableFloatSlider, EditableIntSlider, FloatSlider, IntSlider,
IntRangeSlider, RangeSlider
DateSlider, DateRangeSlider, DatetimeRangeSlider, DiscreteSlider,
EditableRangeSlider, EditableFloatSlider, EditableIntSlider,
FloatSlider, IntSlider, IntRangeSlider, RangeSlider
)
from .select import ( # noqa
AutocompleteInput, CheckBoxGroup, CheckButtonGroup, CrossSelector,
Expand All @@ -84,7 +84,7 @@
from .terminal import Terminal # noqa
from .debugger import Debugger # noqa
from .text_to_speech import TextToSpeech, Utterance, Voice # noqa
from .texteditor import TextEditor# noqa
from .texteditor import TextEditor # noqa

__all__ = (
"Ace",
Expand All @@ -101,6 +101,7 @@
"DataFrame",
"DatePicker",
"DateRangeSlider",
"DatetimeRangeSlider",
"DateSlider",
"DatetimeInput",
"DatetimePicker",
Expand Down
31 changes: 31 additions & 0 deletions panel/widgets/slider.py
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,37 @@ def _process_property_change(self, msg):
return msg



class DatetimeRangeSlider(DateRangeSlider):

"""
The DatetimeRangeSlider widget allows selecting a datetime range
using a slider with two handles. Supports datetime.datetime and
np.datetime64 ranges.
Reference: https://panel.holoviz.org/reference/widgets/DatetimeRangeSlider.html
:Example:
>>> import datetime as dt
>>> DatetimeRangeSlider(
... value=(dt.datetime(2025, 1, 9), dt.datetime(2025, 1, 16)),
... start=dt.datetime(2025, 1, 1),
... end=dt.datetime(2025, 1, 31),
... step=10000,
... name="A tuple of datetimes"
... )
"""

@property
def _widget_type(self):
try:
from bokeh.models import DatetimeRangeSlider
except Exception:
raise ValueError("DatetimeRangeSlider requires bokeh >= 2.4.3")
return DatetimeRangeSlider


class _EditableContinuousSlider(CompositeWidget):
"""
The EditableFloatSlider extends the FloatSlider by adding a text
Expand Down

0 comments on commit 8b56f2b

Please sign in to comment.