13
13
import os
14
14
import os .path as op
15
15
from pathlib import Path
16
- import pydicom as dcm
17
- from pydicom .tag import TagType
18
16
import re
19
17
import shutil
20
18
import stat
39
37
)
40
38
import warnings
41
39
40
+ import pydicom as dcm
41
+ from pydicom .tag import TagType
42
+
42
43
lgr = logging .getLogger (__name__ )
43
44
44
45
T = TypeVar ("T" )
@@ -697,21 +698,23 @@ def strptime_micr(date_string: str, fmt: str) -> datetime.datetime:
697
698
return datetime .datetime .strptime (date_string , fmt )
698
699
699
700
700
- def datetime_utc_offset (datetime_obj : datetime .datetime , utc_offset : str ) -> datetime .datetime :
701
+ def datetime_utc_offset (
702
+ datetime_obj : datetime .datetime , utc_offset : str
703
+ ) -> datetime .datetime :
701
704
"""set the datetime's tzinfo by parsing an utc offset string"""
702
705
# https://dicom.innolitics.com/ciods/electromyogram/sop-common/00080201
703
706
extract_offset = re .match (r"([+\-]?)(\d{2})(\d{2})" , utc_offset )
704
707
if extract_offset is None :
705
708
raise ValueError (f"utc offset { utc_offset } is not valid" )
706
709
sign , hours , minutes = extract_offset .groups ()
707
- sign = - 1 if sign == '-' else 1
710
+ sign = - 1 if sign == "-" else 1
708
711
hours , minutes = int (hours ), int (minutes )
709
712
tzinfo = datetime .timezone (sign * datetime .timedelta (hours = hours , minutes = minutes ))
710
713
return datetime_obj .replace (tzinfo = tzinfo )
711
714
712
715
713
716
def strptime (datetime_string : str , fmts : list [str ]) -> datetime .datetime :
714
- r """
717
+ """
715
718
Try datetime.strptime on a list of formats returning the first successful attempt.
716
719
717
720
Parameters
@@ -731,7 +734,7 @@ def strptime(datetime_string: str, fmts: list[str]) -> datetime.datetime:
731
734
732
735
733
736
def strptime_bids (datetime_string : str ) -> datetime .datetime :
734
- r """
737
+ """
735
738
Create a datetime object from a bids datetime string.
736
739
737
740
Parameters
@@ -740,13 +743,20 @@ def strptime_bids(datetime_string: str) -> datetime.datetime:
740
743
Datetime string to parse
741
744
"""
742
745
# https://bids-specification.readthedocs.io/en/stable/common-principles.html#units
743
- fmts = ["%Y-%m-%dT%H:%M:%S.%f%z" , "%Y-%m-%dT%H:%M:%S%z" , "%Y-%m-%dT%H:%M:%S.%f" , "%Y-%m-%dT%H:%M:%S" ]
746
+ fmts = [
747
+ "%Y-%m-%dT%H:%M:%S.%f%z" ,
748
+ "%Y-%m-%dT%H:%M:%S%z" ,
749
+ "%Y-%m-%dT%H:%M:%S.%f" ,
750
+ "%Y-%m-%dT%H:%M:%S" ,
751
+ ]
744
752
datetime_obj = strptime (datetime_string , fmts )
745
753
return datetime_obj
746
754
747
755
748
- def strptime_dcm_da_tm (dcm_data : dcm .Dataset , da_tag : TagType , tm_tag : TagType ) -> datetime .datetime :
749
- r"""
756
+ def strptime_dcm_da_tm (
757
+ dcm_data : dcm .Dataset , da_tag : TagType , tm_tag : TagType
758
+ ) -> datetime .datetime :
759
+ """
750
760
Create a datetime object from a dicom DA tag and TM tag.
751
761
752
762
Parameters
@@ -760,7 +770,9 @@ def strptime_dcm_da_tm(dcm_data: dcm.Dataset, da_tag: TagType, tm_tag: TagType)
760
770
"""
761
771
# https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html
762
772
date_str = dcm_data [da_tag ].value .strip ()
763
- fmts = ["%Y%m%d" ,]
773
+ fmts = [
774
+ "%Y%m%d" ,
775
+ ]
764
776
date = strptime (date_str , fmts )
765
777
766
778
time_str = dcm_data [tm_tag ].value .strip ()
@@ -771,12 +783,16 @@ def strptime_dcm_da_tm(dcm_data: dcm.Dataset, da_tag: TagType, tm_tag: TagType)
771
783
772
784
if utc_offset_dcm := dcm_data .get ((0x0008 , 0x0201 )):
773
785
utc_offset = utc_offset_dcm .value .strip ()
774
- datetime_obj = datetime_utc_offset (datetime_obj , utc_offset ) if utc_offset else datetime_obj
786
+ datetime_obj = (
787
+ datetime_utc_offset (datetime_obj , utc_offset )
788
+ if utc_offset
789
+ else datetime_obj
790
+ )
775
791
return datetime_obj
776
792
777
793
778
794
def strptime_dcm_dt (dcm_data : dcm .Dataset , dt_tag : TagType ) -> datetime .datetime :
779
- r """
795
+ """
780
796
Create a datetime object from a dicom DT tag.
781
797
782
798
Parameters
@@ -789,15 +805,33 @@ def strptime_dcm_dt(dcm_data: dcm.Dataset, dt_tag: TagType) -> datetime.datetime
789
805
"""
790
806
# https://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_6.2.html
791
807
datetime_str = dcm_data [dt_tag ].value .strip ()
792
- fmts = ["%Y%z" , "%Y%m%z" , "%Y%m%d%z" , "%Y%m%d%H%z" , "%Y%m%d%H%M%z" , "%Y%m%d%H%M%S%z" , "%Y%m%d%H%M%S.%f%z" ,
793
- "%Y" , "%Y%m" , "%Y%m%d" , "%Y%m%d%H" , "%Y%m%d%H%M" , "%Y%m%d%H%M%S" , "%Y%m%d%H%M%S.%f" ]
808
+ fmts = [
809
+ "%Y%z" ,
810
+ "%Y%m%z" ,
811
+ "%Y%m%d%z" ,
812
+ "%Y%m%d%H%z" ,
813
+ "%Y%m%d%H%M%z" ,
814
+ "%Y%m%d%H%M%S%z" ,
815
+ "%Y%m%d%H%M%S.%f%z" ,
816
+ "%Y" ,
817
+ "%Y%m" ,
818
+ "%Y%m%d" ,
819
+ "%Y%m%d%H" ,
820
+ "%Y%m%d%H%M" ,
821
+ "%Y%m%d%H%M%S" ,
822
+ "%Y%m%d%H%M%S.%f" ,
823
+ ]
794
824
datetime_obj = strptime (datetime_str , fmts )
795
825
796
826
if utc_offset_dcm := dcm_data .get ((0x0008 , 0x0201 )):
797
827
if utc_offset := utc_offset_dcm .value .strip ():
798
828
datetime_obj2 = datetime_utc_offset (datetime_obj , utc_offset )
799
829
if datetime_obj .tzinfo and datetime_obj2 != datetime_obj :
800
- lgr .warning ("Unexpectedly previously parsed datetime %s contains zoneinfo which is different from the one obtained from DICOMs UTFOffset field: %s" , datetime_obj , datetime_obj2 )
830
+ lgr .warning (
831
+ "Unexpectedly previously parsed datetime %s contains zoneinfo which is different from the one obtained from DICOMs UTFOffset field: %s" ,
832
+ datetime_obj ,
833
+ datetime_obj2 ,
834
+ )
801
835
else :
802
836
datetime_obj = datetime_obj2
803
837
return datetime_obj
0 commit comments