Handle last-in-view time slicing edge case
Whenever the last datum is in view `slice_from_time()` need to always spec the final array index (i.e. the len - 1 value we set as `read_i_max`) to avoid a uniform-step arithmetic error where gaps in the underlying time series causes an index that's too low to be returned.epoch_index_backup
parent
05fced37f1
commit
d2fec7016a
|
@ -17,6 +17,11 @@
|
||||||
Super fast ``QPainterPath`` generation related operator routines.
|
Super fast ``QPainterPath`` generation related operator routines.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
from math import (
|
||||||
|
ceil,
|
||||||
|
floor,
|
||||||
|
)
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from numpy.lib import recfunctions as rfn
|
from numpy.lib import recfunctions as rfn
|
||||||
from numba import (
|
from numba import (
|
||||||
|
@ -308,22 +313,32 @@ def slice_from_time(
|
||||||
)
|
)
|
||||||
|
|
||||||
times = arr['time']
|
times = arr['time']
|
||||||
t_first = round(times[0])
|
t_first = floor(times[0])
|
||||||
|
t_last = ceil(times[-1])
|
||||||
|
|
||||||
|
# the greatest index we can return which slices to the
|
||||||
|
# end of the input array.
|
||||||
read_i_max = arr.shape[0]
|
read_i_max = arr.shape[0]
|
||||||
|
|
||||||
|
# TODO: require this is always passed in?
|
||||||
if step is None:
|
if step is None:
|
||||||
step = round(times[-1] - times[-2])
|
step = round(t_last - times[-2])
|
||||||
if step == 0:
|
if step == 0:
|
||||||
# XXX: HOW TF is this happening?
|
|
||||||
step = 1
|
step = 1
|
||||||
|
|
||||||
# compute (presumed) uniform-time-step index offsets
|
# compute (presumed) uniform-time-step index offsets
|
||||||
i_start_t = round(start_t)
|
i_start_t = floor(start_t)
|
||||||
read_i_start = round(((i_start_t - t_first) // step)) - 1
|
read_i_start = floor(((i_start_t - t_first) // step)) - 1
|
||||||
|
|
||||||
i_stop_t = round(stop_t)
|
i_stop_t = ceil(stop_t)
|
||||||
read_i_stop = round((i_stop_t - t_first) // step) + 1
|
|
||||||
|
# XXX: edge case -> always set stop index to last in array whenever
|
||||||
|
# the input stop time is detected to be greater then the equiv time
|
||||||
|
# stamp at that last entry.
|
||||||
|
if i_stop_t >= t_last:
|
||||||
|
read_i_stop = read_i_max
|
||||||
|
else:
|
||||||
|
read_i_stop = ceil((i_stop_t - t_first) // step) + 1
|
||||||
|
|
||||||
# always clip outputs to array support
|
# always clip outputs to array support
|
||||||
# for read start:
|
# for read start:
|
||||||
|
@ -367,7 +382,7 @@ def slice_from_time(
|
||||||
# up_to_arith_start = index[:read_i_start]
|
# up_to_arith_start = index[:read_i_start]
|
||||||
|
|
||||||
if (
|
if (
|
||||||
new_read_i_start < read_i_start
|
new_read_i_start <= read_i_start
|
||||||
):
|
):
|
||||||
# t_diff = t_iv_start - start_t
|
# t_diff = t_iv_start - start_t
|
||||||
# print(
|
# print(
|
||||||
|
@ -391,14 +406,15 @@ def slice_from_time(
|
||||||
# )
|
# )
|
||||||
new_read_i_stop = np.searchsorted(
|
new_read_i_stop = np.searchsorted(
|
||||||
times[read_i_start:],
|
times[read_i_start:],
|
||||||
|
# times,
|
||||||
i_stop_t,
|
i_stop_t,
|
||||||
side='left',
|
side='left',
|
||||||
)
|
)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
new_read_i_stop < read_i_stop
|
new_read_i_stop <= read_i_stop
|
||||||
):
|
):
|
||||||
read_i_stop = read_i_start + new_read_i_stop
|
read_i_stop = read_i_start + new_read_i_stop + 1
|
||||||
|
|
||||||
# sanity checks for range size
|
# sanity checks for range size
|
||||||
# samples = (i_stop_t - i_start_t) // step
|
# samples = (i_stop_t - i_start_t) // step
|
||||||
|
|
Loading…
Reference in New Issue