From cf9c0018a5095ac00bcde09c721e7ebc4888c121 Mon Sep 17 00:00:00 2001 From: jochenstahn Date: Mon, 9 Dec 2024 10:03:56 +0100 Subject: [PATCH 1/6] tried to handle summer time correctly.... --- libeos/file_reader.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libeos/file_reader.py b/libeos/file_reader.py index 6ab0aa9..d138bff 100644 --- a/libeos/file_reader.py +++ b/libeos/file_reader.py @@ -3,6 +3,7 @@ import os import subprocess import sys from datetime import datetime, timezone +import pytz from typing import List import h5py @@ -373,7 +374,7 @@ class AmorData: self.pixelID_e = self.pixelID_e[filter_e] self.wallTime_e = self.wallTime_e[filter_e] if np.shape(filter_e)[0]-np.shape(self.tof_e)[0]>0.5: - logging.warning(f'# strange times: {np.shape(filter_e)[0]-np.shape(self.tof_e)[0]}') + logging.warning(f' strange times: {np.shape(filter_e)[0]-np.shape(self.tof_e)[0]}') def read_event_stream(self): self.tof_e = np.array(self.hdf['/entry1/Amor/detector/data/event_time_offset'][:])/1.e9 @@ -437,7 +438,11 @@ class AmorData: self.nu = self.config.nu # extract start time as unix time, adding UTC offset of 1h to time string - self.fileDate = datetime.fromisoformat( self.hdf['/entry1/start_time'][0].decode('utf-8')+"+01:00" ) + tz = pytz.timezone('Europe/Zurich') + fileDate = datetime.fromisoformat( self.hdf['/entry1/start_time'][0].decode('utf-8')) + timeOffset = f'{int(str(tz.utcoffset(fileDate)).split(':')[0]):+03d}' + #self.fileDate = datetime.fromisoformat( self.hdf['/entry1/start_time'][0].decode('utf-8')+"+02:00" ) + self.fileDate = datetime.fromisoformat( self.hdf['/entry1/start_time'][0].decode('utf-8')+timeOffset ) self.startTime = np.int64( (self.fileDate.timestamp() ) * 1e9 ) if self.seriesStartTime is None: self.seriesStartTime = self.startTime From c5f5602a898681578103561acb6da459039534f2 Mon Sep 17 00:00:00 2001 From: Jochen Stahn <57442805+jochenstahn@users.noreply.github.com> Date: Mon, 9 Dec 2024 10:19:22 +0100 Subject: [PATCH 2/6] added pytz --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index b86897a..3c5c317 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ numpy h5py orsopy numba +pytz From c1dc194548add19d83169fbcd87d0e6f43e1b671 Mon Sep 17 00:00:00 2001 From: Jochen Stahn <57442805+jochenstahn@users.noreply.github.com> Date: Tue, 10 Dec 2024 14:39:59 +0100 Subject: [PATCH 3/6] different method to add timezone --- libeos/file_reader.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libeos/file_reader.py b/libeos/file_reader.py index d138bff..ad3bd44 100644 --- a/libeos/file_reader.py +++ b/libeos/file_reader.py @@ -3,7 +3,7 @@ import os import subprocess import sys from datetime import datetime, timezone -import pytz +import zoneinfo from typing import List import h5py @@ -438,11 +438,11 @@ class AmorData: self.nu = self.config.nu # extract start time as unix time, adding UTC offset of 1h to time string - tz = pytz.timezone('Europe/Zurich') - fileDate = datetime.fromisoformat( self.hdf['/entry1/start_time'][0].decode('utf-8')) - timeOffset = f'{int(str(tz.utcoffset(fileDate)).split(':')[0]):+03d}' - #self.fileDate = datetime.fromisoformat( self.hdf['/entry1/start_time'][0].decode('utf-8')+"+02:00" ) - self.fileDate = datetime.fromisoformat( self.hdf['/entry1/start_time'][0].decode('utf-8')+timeOffset ) + tz = zoneinfo.ZoneInfo(key='Europe/Zurich') + dz = datetime.fromisoformat(self.hdf['/entry1/start_time'][0].decode('utf-8')) + self.fileDate=datetime(dz.year, dz.month, dz.day, dz.hour, dz.minute, dz.second, tzinfo=tz) + #timeOffset = f'{int(str(tz.utcoffset(dz)).split(':')[0]):+03d}' + #self.fileDate = datetime.fromisoformat( self.hdf['/entry1/start_time'][0].decode('utf-8')+timeOffset ) self.startTime = np.int64( (self.fileDate.timestamp() ) * 1e9 ) if self.seriesStartTime is None: self.seriesStartTime = self.startTime From 3e22a94ff6186969ed9331b6c1b170de2b9fa206 Mon Sep 17 00:00:00 2001 From: Artur Glavic Date: Fri, 13 Dec 2024 14:07:12 +0100 Subject: [PATCH 4/6] install zoneinfo backports for python 3.8 --- .github/workflows/unit_tests.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index b833369..f46b7db 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - python-version: [3.8, 3.9, '3.10', '3.11', '3.12'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] fail-fast: false steps: @@ -31,6 +31,11 @@ jobs: pip install pytest pip install -r requirements.txt + - name: Backport to 3.8 + if: matrix.python-version == '3.8' + run: | + pip install backports.zoneinfo + - name: Test with pytest run: | cd tests From f81582554e21bf3fc1a2d46754322633453ef383 Mon Sep 17 00:00:00 2001 From: Artur Glavic Date: Fri, 13 Dec 2024 14:17:51 +0100 Subject: [PATCH 5/6] remove unnecessary requirement for pytz and insert timezone into datetime instead of recreation --- libeos/file_reader.py | 14 ++++++++++---- requirements.txt | 1 - 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libeos/file_reader.py b/libeos/file_reader.py index ad3bd44..723f79c 100644 --- a/libeos/file_reader.py +++ b/libeos/file_reader.py @@ -3,7 +3,11 @@ import os import subprocess import sys from datetime import datetime, timezone -import zoneinfo +try: + import zoneinfo +except ImportError: + # for python versions < 3.9 try to use the backports version + from backports import zoneinfo from typing import List import h5py @@ -21,6 +25,9 @@ try: except Exception: nb_helpers = None +# Time zone used to interpret time strings +AMOR_LOCAL_TIMEZONE = zoneinfo.ZoneInfo(key='Europe/Zurich') + class AmorData: """read meta-data and event streams from .hdf file(s), apply filters and conversions""" chopperDetectorDistance: float @@ -438,9 +445,8 @@ class AmorData: self.nu = self.config.nu # extract start time as unix time, adding UTC offset of 1h to time string - tz = zoneinfo.ZoneInfo(key='Europe/Zurich') - dz = datetime.fromisoformat(self.hdf['/entry1/start_time'][0].decode('utf-8')) - self.fileDate=datetime(dz.year, dz.month, dz.day, dz.hour, dz.minute, dz.second, tzinfo=tz) + dz = datetime.fromisoformat(self.hdf['/entry1/start_time'][0].decode('utf-8')) + self.fileDate=dz.replace(tzinfo=AMOR_LOCAL_TIMEZONE) #timeOffset = f'{int(str(tz.utcoffset(dz)).split(':')[0]):+03d}' #self.fileDate = datetime.fromisoformat( self.hdf['/entry1/start_time'][0].decode('utf-8')+timeOffset ) self.startTime = np.int64( (self.fileDate.timestamp() ) * 1e9 ) diff --git a/requirements.txt b/requirements.txt index 3c5c317..b86897a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,3 @@ numpy h5py orsopy numba -pytz From 55a7b7270c7272f2e3f08378a7a3f22c9ec30683 Mon Sep 17 00:00:00 2001 From: Artur Glavic Date: Fri, 13 Dec 2024 14:33:04 +0100 Subject: [PATCH 6/6] minor cleanup --- libeos/file_reader.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/libeos/file_reader.py b/libeos/file_reader.py index 723f79c..e0a68d3 100644 --- a/libeos/file_reader.py +++ b/libeos/file_reader.py @@ -447,8 +447,6 @@ class AmorData: # extract start time as unix time, adding UTC offset of 1h to time string dz = datetime.fromisoformat(self.hdf['/entry1/start_time'][0].decode('utf-8')) self.fileDate=dz.replace(tzinfo=AMOR_LOCAL_TIMEZONE) - #timeOffset = f'{int(str(tz.utcoffset(dz)).split(':')[0]):+03d}' - #self.fileDate = datetime.fromisoformat( self.hdf['/entry1/start_time'][0].decode('utf-8')+timeOffset ) self.startTime = np.int64( (self.fileDate.timestamp() ) * 1e9 ) if self.seriesStartTime is None: self.seriesStartTime = self.startTime