Datetime handling

This notebook illustrates the behavior of the datetime tick formatter, depending on duration of the displayed time range.

The formatter attempts to automatically adjust the precision of the tick labels for optimal readbility, while retaining all the information necessary. This involves attaching a time offset to the axis label (time in the examples below), as well as inserting additional date or time indicators below ticks, when more than one date or time are present on the same axis.

[1]:
import scipp as sc
import numpy as np

More than 100 years

[2]:
time = sc.array(dims=['time'], values=np.arange(np.datetime64('1907-11-20T23:58:17'),
                                                np.datetime64('2017-03-01T00:05:17'), 1000000))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()

Less than 100 years

[3]:
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2010-11-20T23:58:17'),
                                                np.datetime64('2017-03-01T00:05:17'), 100000))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()

Less than 4 years

[4]:
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-01-20T23:58:17'),
                                                np.datetime64('2017-12-01T00:05:17'), 10000))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()

Less than 6 months

[5]:
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-01-20T23:58:17'),
                                                np.datetime64('2017-05-01T00:05:17'), 10000))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()

Less than 4 days

[6]:
# standard case
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-06-17T00:58:17'),
                                                np.datetime64('2017-06-17T18:05:17'), 100))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()
[7]:
# date change
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-06-17T03:58:17'),
                                                np.datetime64('2017-06-18T10:05:17'), 1000))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()

Less than 4 hours

[8]:
# standard case
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T20:58:17'),
                                                np.datetime64('2017-03-16T21:15:17'), 10))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()
[9]:
# date change
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-17T23:58:17'),
                                                np.datetime64('2017-03-18T00:05:17'), 10))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()

Less than 4 minutes

[10]:
# standard case
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T20:50:17.500'),
                                                np.datetime64('2017-03-16T20:53:59.010'), 100))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()
[11]:
# date change
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T23:58:17.666'),
                                                np.datetime64('2017-03-17T00:02:10.532'), 100))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()

Less than 4 seconds

[12]:
# standard case
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T20:50:17.200'),
                                                np.datetime64('2017-03-16T20:50:17.810'), 10))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()
[13]:
# time change
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T20:50:17.200'),
                                                np.datetime64('2017-03-16T20:50:18.810'), 10))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()
[14]:
# date change
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T23:59:59.500'),
                                                np.datetime64('2017-03-17T00:00:01.010'), 10))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()

Less than 4 milliseconds

[15]:
# standard case
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T20:50:17.123456'),
                                                np.datetime64('2017-03-16T20:50:17.127000'), 10))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()
[16]:
# time change
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T20:50:17.998756'),
                                                np.datetime64('2017-03-16T20:50:18.002122'), 10))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()
[17]:
# date change
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T23:59:59.998756'),
                                                np.datetime64('2017-03-17T00:00:00.002122'), 10))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()

Less than 4 microseconds

[18]:
# standard case
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T20:50:17.123456789'),
                                                np.datetime64('2017-03-16T20:50:17.123458000'), 10))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()
[19]:
# time change
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T20:50:17.999998789'),
                                                np.datetime64('2017-03-16T20:50:18.000002000'), 10))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()
[20]:
# date change
time = sc.array(dims=['time'], values=np.arange(np.datetime64('2017-03-16T23:59:59.999998789'),
                                                np.datetime64('2017-03-17T00:00:00.000002000'), 10))
data = sc.DataArray(data=sc.array(dims=['time'], values=np.random.rand(time.sizes['time'])),
                    coords={'time':time})
data.plot()