diff --git a/src/osekit/core/spectro_data.py b/src/osekit/core/spectro_data.py index 127b122e..47f19581 100644 --- a/src/osekit/core/spectro_data.py +++ b/src/osekit/core/spectro_data.py @@ -17,7 +17,6 @@ import matplotlib.pyplot as plt import numpy as np import pandas as pd -from matplotlib.dates import date2num from pandas import Timedelta from scipy.signal import ShortTimeFFT, welch @@ -428,7 +427,7 @@ def plot( sx = sx if scale is None else scale.rescale(sx_matrix=sx, original_scale=freq) - ax.xaxis_date() + ax.xaxis_date(tz=time.tz) if time.tz else ax.xaxis_date() ax.imshow( sx, vmin=self._v_lim[0], @@ -437,7 +436,7 @@ def plot( origin="lower", aspect="auto", interpolation="none", - extent=(date2num(time[0]), date2num(time[-1]), freq[0], freq[-1]), + extent=(time[0], time[-1], freq[0], freq[-1]), ) def get_db_value(self, sx: np.ndarray | None = None) -> np.ndarray: diff --git a/tests/test_spectro.py b/tests/test_spectro.py index 9fc38ae3..257ef8f0 100644 --- a/tests/test_spectro.py +++ b/tests/test_spectro.py @@ -1,6 +1,7 @@ from __future__ import annotations import contextlib +import datetime import gc from contextlib import nullcontext from pathlib import Path @@ -9,7 +10,6 @@ import numpy as np import pandas as pd import pytest -from matplotlib.dates import num2date from pandas import Timedelta, Timestamp from scipy.signal import ShortTimeFFT from scipy.signal.windows import hamming @@ -1434,7 +1434,6 @@ def mock_imshow( assert plot_kwargs["interpolation"] == "none" t1, t2, f1, f2 = plot_kwargs["extent"] - t1, t2 = map(num2date, (t1, t2)) t1, t2 = map(Timestamp, (t1, t2)) assert t1 == sd.begin assert t2 == sd.end @@ -1442,6 +1441,50 @@ def mock_imshow( assert f2 == sd.fft.f[-1] +@pytest.mark.parametrize( + "audio_files", + [ + {"date_begin": Timestamp("2026-01-01 00:00:00", tz="Europe/Paris")}, + {"date_begin": Timestamp("2025-12-31 23:59:59", tz="+0300")}, + {"date_begin": Timestamp("2025-12-31 23:59:59")}, + ], + indirect=True, + ids=["%Z", "%z", "naive"], +) +def test_plot_timezone( + audio_files: tuple[list[AudioFile], ...], + monkeypatch: pytest.MonkeyPatch, +) -> None: + audio_files, _ = audio_files + ad = AudioData.from_files(audio_files) + sd = SpectroData.from_audio_data( + data=ad, + fft=ShortTimeFFT(hamming(1024), 512, ad.sample_rate), + ) + + called_ax = set() + + def mock_imshow( + self: plt.Axes, + sx: np.ndarray, + **kwargs: str, + ) -> None: + called_ax.add(self) + + monkeypatch.setattr(plt.Axes, "imshow", mock_imshow) + + _, ax = plt.subplots() + sd.plot(ax=ax) + spectro_data_axes = called_ax.pop() + + if sd.begin.tz: + assert isinstance(spectro_data_axes.xaxis.units, datetime.tzinfo) + else: + assert spectro_data_axes.xaxis.units is None + + + + def test_spectro_default_v_lim(audio_files: pytest.fixture) -> None: files, _ = audio_files ad = AudioData.from_files(files)