Skip to content

Commit 5956e93

Browse files
committed
Add get_timestamp 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 add3b34 commit 5956e93

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

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

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

260+
def get_timestamp(self, index: int) -> datetime | None:
261+
"""Convert the given index to the underlying timestamp.
262+
263+
Index 0 corresponds to the oldest timestamp in the buffer.
264+
If negative indices are used, the newest timestamp is used as reference.
265+
266+
!!!warning
267+
268+
The resulting timestamp can be outside the range of the buffer.
269+
270+
Args:
271+
index: Index to convert.
272+
273+
Returns:
274+
Datetime index where the value for the given index can be found.
275+
Or None if the buffer is empty.
276+
"""
277+
if self.oldest_timestamp is None:
278+
return None
279+
assert self.newest_timestamp is not None
280+
ref_ts = (
281+
self.oldest_timestamp
282+
if index >= 0
283+
else self.newest_timestamp + self._sampling_period
284+
)
285+
return ref_ts + index * self._sampling_period
286+
260287
def window(
261288
self, start: datetime, end: datetime, *, force_copy: bool = True
262289
) -> 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_get_timestamp() -> None:
596+
"""Test the get_timestamp 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.get_timestamp(-1)
604+
assert dt(0) == buffer.get_timestamp(-5)
605+
assert dt(-1) == buffer.get_timestamp(-6)
606+
assert dt(0) == buffer.get_timestamp(0)
607+
assert dt(5) == buffer.get_timestamp(5)
608+
assert dt(6) == buffer.get_timestamp(6)
609+
610+
for i in range(10, 15):
611+
buffer.update(Sample(dt(i), Quantity(i)))
612+
assert dt(14) == buffer.get_timestamp(-1)
613+
assert dt(10) == buffer.get_timestamp(-5)
614+
assert dt(9) == buffer.get_timestamp(-6)
615+
assert dt(10) == buffer.get_timestamp(0)
616+
assert dt(15) == buffer.get_timestamp(5)
617+
assert dt(16) == buffer.get_timestamp(6)

0 commit comments

Comments
 (0)