From c1d08b0c06a0d5fa4c0d32f58efaaa5b710f581b Mon Sep 17 00:00:00 2001 From: Mathieu Dupont <108517594+mathieudpnt@users.noreply.github.com> Date: Tue, 18 Nov 2025 10:01:38 +0100 Subject: [PATCH 1/3] sunrise/sunset accept local timezones --- src/post_processing/dataclass/data_aplose.py | 16 ++++++++++++++- src/post_processing/utils/filtering_utils.py | 21 ++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/post_processing/dataclass/data_aplose.py b/src/post_processing/dataclass/data_aplose.py index 0939966..59cb01b 100644 --- a/src/post_processing/dataclass/data_aplose.py +++ b/src/post_processing/dataclass/data_aplose.py @@ -167,7 +167,21 @@ def __getitem__(self, item: int) -> Series: return self.df.iloc[item] def change_tz(self, tz: str | tzinfo) -> None: - """Change the timezone of the DataFrame and of the begin and end Timestamps.""" + """Change the timezone of a DataAplose instance. + + Examples + -------- + >>> import pytz + >>> data = DataAplose(...) + >>> data.change_tz(pytz.timezone("Etc/GMT-2")) + + >>> data = DataAplose(...) + >>> data.change_tz("UTC") + + >>> data = DataAplose(...) + >>> data.change_tz("UTC+02:00") + + """ self.df["start_datetime"] = [ elem.tz_convert(tz) for elem in self.df["start_datetime"] diff --git a/src/post_processing/utils/filtering_utils.py b/src/post_processing/utils/filtering_utils.py index db1484f..05a8a22 100644 --- a/src/post_processing/utils/filtering_utils.py +++ b/src/post_processing/utils/filtering_utils.py @@ -6,6 +6,7 @@ import csv from typing import TYPE_CHECKING +import pytz from pandas import ( DataFrame, Timedelta, @@ -176,9 +177,25 @@ def get_dataset(df: DataFrame) -> list[str]: return datasets if len(datasets) > 1 else datasets[0] -def get_timezone(df: DataFrame) -> tzoffset | list[tzoffset]: +def get_timezone(df: DataFrame): """Return timezone(s) from DataFrame.""" - timezones = {ts.tz for ts in df["start_datetime"] if ts.tz is not None} + # timezones = {pytz.timezone(ts.tz.zone) for ts in df["start_datetime"]} + + def get_canonical_tz(tz): + # pytz timezones + if hasattr(tz, "zone") and tz.zone: + return pytz.timezone(tz.zone) + + # zoneinfo timezones (Python 3.9+) + if hasattr(tz, "key"): + return pytz.timezone(tz.key) + + # dateutil.tzutc or unknown → fallback to UTC + return pytz.UTC + + + timezones = {get_canonical_tz(ts.tzinfo) for ts in df["start_datetime"]} + if len(timezones) == 1: return next(iter(timezones)) return list(timezones) From 2b9447ee4c3f8130d85904422ea99a95ebb57b66 Mon Sep 17 00:00:00 2001 From: Mathieu Dupont <108517594+mathieudpnt@users.noreply.github.com> Date: Tue, 18 Nov 2025 10:51:52 +0100 Subject: [PATCH 2/3] test fix --- src/post_processing/utils/filtering_utils.py | 7 ------- tests/test_filtering_utils.py | 5 +++-- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/post_processing/utils/filtering_utils.py b/src/post_processing/utils/filtering_utils.py index 05a8a22..6256b43 100644 --- a/src/post_processing/utils/filtering_utils.py +++ b/src/post_processing/utils/filtering_utils.py @@ -179,21 +179,14 @@ def get_dataset(df: DataFrame) -> list[str]: def get_timezone(df: DataFrame): """Return timezone(s) from DataFrame.""" - # timezones = {pytz.timezone(ts.tz.zone) for ts in df["start_datetime"]} def get_canonical_tz(tz): - # pytz timezones if hasattr(tz, "zone") and tz.zone: return pytz.timezone(tz.zone) - - # zoneinfo timezones (Python 3.9+) if hasattr(tz, "key"): return pytz.timezone(tz.key) - - # dateutil.tzutc or unknown → fallback to UTC return pytz.UTC - timezones = {get_canonical_tz(ts.tzinfo) for ts in df["start_datetime"]} if len(timezones) == 1: diff --git a/tests/test_filtering_utils.py b/tests/test_filtering_utils.py index f8a3745..885dc9e 100644 --- a/tests/test_filtering_utils.py +++ b/tests/test_filtering_utils.py @@ -3,6 +3,7 @@ from pathlib import Path import pytest +import pytz from pandas import DataFrame, Timedelta, Timestamp, date_range from post_processing.utils.filtering_utils import ( @@ -170,10 +171,10 @@ def test_get_dataset(sample_df: DataFrame) -> None: def test_get_timezone_single(sample_df: DataFrame) -> None: tz = get_timezone(sample_df) - assert isinstance(tz, timezone) + assert tz == pytz.utc -# %% read DataFrame +# %% read DataFrame def test_read_dataframe_comma_delimiter(tmp_path: Path) -> None: csv_file = tmp_path / "test.csv" From 6100d19a3b4bfd342b9de683be03ff508ef6d091 Mon Sep 17 00:00:00 2001 From: Mathieu Dupont <108517594+mathieudpnt@users.noreply.github.com> Date: Tue, 18 Nov 2025 11:13:59 +0100 Subject: [PATCH 3/3] test fix --- src/post_processing/utils/filtering_utils.py | 2 -- tests/test_filtering_utils.py | 1 - 2 files changed, 3 deletions(-) diff --git a/src/post_processing/utils/filtering_utils.py b/src/post_processing/utils/filtering_utils.py index 6256b43..5083c7d 100644 --- a/src/post_processing/utils/filtering_utils.py +++ b/src/post_processing/utils/filtering_utils.py @@ -20,8 +20,6 @@ if TYPE_CHECKING: from pathlib import Path - from dateutil.tz import tzoffset - from post_processing.dataclass.detection_filter import DetectionFilter diff --git a/tests/test_filtering_utils.py b/tests/test_filtering_utils.py index 885dc9e..622ad2a 100644 --- a/tests/test_filtering_utils.py +++ b/tests/test_filtering_utils.py @@ -1,5 +1,4 @@ import csv -from datetime import timezone from pathlib import Path import pytest