Skip to content

Commit da3fccc

Browse files
committed
Add index_to_datetime method
This method maps an index passed by the user to its corresponding timestamp of the ring buffer. Signed-off-by: cwasicki <[email protected]>
1 parent b71335f commit da3fccc

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

src/frequenz/sdk/timeseries/_ringbuffer/buffer.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,29 @@ def to_internal_index(
257257
)
258258
)
259259

260+
def index_to_datetime(self, index: int) -> datetime | None:
261+
"""Convert the given index to the underlying datetime.
262+
263+
Index 0 corresponds to the oldest timestamp in the buffer. The
264+
resulting datetime can be outside the range of the buffer.
265+
266+
Args:
267+
index: Index to convert.
268+
269+
Returns:
270+
Datetime index where the value for the given index can be found.
271+
Or None if the buffer is empty.
272+
"""
273+
if self.oldest_timestamp is None:
274+
return None
275+
assert self.newest_timestamp is not None
276+
ref_ts = (
277+
self.oldest_timestamp
278+
if index >= 0
279+
else self.newest_timestamp + self._sampling_period
280+
)
281+
return ref_ts + index * self._sampling_period
282+
260283
def window(
261284
self, start: datetime, end: datetime, *, force_copy: bool = True
262285
) -> FloatArray:

tests/timeseries/test_ringbuffer.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,3 +590,28 @@ def test_wrapped_buffer_window() -> None:
590590
assert [3, 9] == list(res2_view)
591591
assert [3, 4] == list(res2_copy)
592592
assert [4, 0] == list(res3_copy)
593+
594+
595+
def test_index_to_datetime() -> None:
596+
"""Test the index_to_datetime function."""
597+
buffer = OrderedRingBuffer(
598+
np.empty(shape=5, dtype=float),
599+
sampling_period=timedelta(seconds=1),
600+
)
601+
for i in range(5):
602+
buffer.update(Sample(dt(i), Quantity(i)))
603+
assert dt(4) == buffer.index_to_datetime(-1)
604+
assert dt(0) == buffer.index_to_datetime(-5)
605+
assert dt(-1) == buffer.index_to_datetime(-6)
606+
assert dt(0) == buffer.index_to_datetime(0)
607+
assert dt(5) == buffer.index_to_datetime(5)
608+
assert dt(6) == buffer.index_to_datetime(6)
609+
610+
for i in range(10, 15):
611+
buffer.update(Sample(dt(i), Quantity(i)))
612+
assert dt(14) == buffer.index_to_datetime(-1)
613+
assert dt(10) == buffer.index_to_datetime(-5)
614+
assert dt(9) == buffer.index_to_datetime(-6)
615+
assert dt(10) == buffer.index_to_datetime(0)
616+
assert dt(15) == buffer.index_to_datetime(5)
617+
assert dt(16) == buffer.index_to_datetime(6)

0 commit comments

Comments
 (0)