Skip to content

Commit 77ba0b3

Browse files
committed
pass tox tests
1 parent 352f721 commit 77ba0b3

File tree

2 files changed

+24
-16
lines changed

2 files changed

+24
-16
lines changed

heudiconv/tests/test_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ def test_strptime_dcm_da_tm(tm: str, tm_fmt: str, offset: str, offset_fmt: str)
229229
da_fmt = "%Y%m%d"
230230
target = datetime.strptime(da + tm + offset, da_fmt + tm_fmt + offset_fmt)
231231
ds = dcm.dataset.Dataset()
232-
ds["AcquisitionDate"] = dcm.DataElement("AcquisitionDate","DA",da)
232+
ds["AcquisitionDate"] = dcm.DataElement("AcquisitionDate", "DA", da)
233233
ds["AcquisitionTime"] = dcm.DataElement("AcquisitionTime", "TM", tm)
234234
if offset:
235235
ds[(0x0008, 0x0201)] = dcm.DataElement((0x0008, 0x0201), "SH", offset)
@@ -269,7 +269,7 @@ def test_strptime_dcm_dt(dt: str, dt_fmt: str, offset: str, offset_fmt: str) ->
269269
else:
270270
target = datetime.strptime(dt + offset, dt_fmt + offset_fmt)
271271
ds = dcm.dataset.Dataset()
272-
ds["AcquisitionDateTime"] = dcm.DataElement("AcquisitionDateTime","DT", dt)
272+
ds["AcquisitionDateTime"] = dcm.DataElement("AcquisitionDateTime", "DT", dt)
273273
if offset:
274274
ds[(0x0008, 0x0201)] = dcm.DataElement((0x0008, 0x0201), "SH", offset)
275275
assert strptime_dcm_dt(ds, "AcquisitionDateTime") == target

heudiconv/utils.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ def get_datetime(date: str, time: str, *, microseconds: bool = True) -> str:
670670
return datetime_str
671671

672672

673-
def strptime_micr(date_string: str, fmt: str) -> datetime:
673+
def strptime_micr(date_string: str, fmt: str) -> datetime.datetime:
674674
r"""
675675
Decorate strptime while supporting optional [.%f] in the format at the end
676676
@@ -691,15 +691,20 @@ def strptime_micr(date_string: str, fmt: str) -> datetime:
691691
return datetime.datetime.strptime(date_string, fmt)
692692

693693

694-
def datetime_utc_offset(datetime_obj: datetime, utc_offset: str):
694+
def datetime_utc_offset(datetime_obj: datetime.datetime, utc_offset: str) -> datetime.datetime:
695695
"""set the datetime's tzinfo by parsing an utc offset string"""
696-
sign, hours, minutes = re.match(r"([+\-]?)(\d{2})(\d{2})", utc_offset).groups()
696+
# https://dicom.innolitics.com/ciods/electromyogram/sop-common/00080201
697+
extract_offset = re.match(r"([+\-]?)(\d{2})(\d{2})", utc_offset)
698+
if extract_offset is None:
699+
raise ValueError(f"utc offset {utc_offset} is not valid")
700+
sign, hours, minutes = extract_offset.groups()
697701
sign = -1 if sign == '-' else 1
698702
hours, minutes = int(hours), int(minutes)
699703
tzinfo = datetime.timezone(sign * datetime.timedelta(hours=hours, minutes=minutes))
700704
return datetime_obj.replace(tzinfo=tzinfo)
701705

702-
def strptime(datetime_string: str, fmts: list[str]) -> datetime:
706+
707+
def strptime(datetime_string: str, fmts: list[str]) -> datetime.datetime:
703708
r"""
704709
Try datetime.strptime on a list of formats returning the first successful attempt.
705710
@@ -718,7 +723,8 @@ def strptime(datetime_string: str, fmts: list[str]) -> datetime:
718723
pass
719724
raise ValueError(f"Unable to parse datetime string: {datetime_str}")
720725

721-
def strptime_bids(datetime_string: str) -> datetime:
726+
727+
def strptime_bids(datetime_string: str) -> datetime.datetime:
722728
r"""
723729
Create a datetime object from a bids datetime string.
724730
@@ -732,7 +738,8 @@ def strptime_bids(datetime_string: str) -> datetime:
732738
datetime_obj = strptime(datetime_string, fmts)
733739
return datetime_obj
734740

735-
def strptime_dcm_da_tm(dcm_data: dcm.Dataset, da_tag: TagType, tm_tag: TagType) -> datetime:
741+
742+
def strptime_dcm_da_tm(dcm_data: dcm.Dataset, da_tag: TagType, tm_tag: TagType) -> datetime.datetime:
736743
r"""
737744
Create a datetime object from a dicom DA tag and TM tag.
738745
@@ -756,12 +763,13 @@ def strptime_dcm_da_tm(dcm_data: dcm.Dataset, da_tag: TagType, tm_tag: TagType)
756763

757764
datetime_obj = datetime.datetime.combine(date.date(), time.time())
758765

759-
if utc_offset_dcm := dcm_data.get([0x0008, 0x0201]):
766+
if utc_offset_dcm := dcm_data.get((0x0008, 0x0201)):
760767
utc_offset = utc_offset_dcm.value.strip()
761768
datetime_obj = datetime_utc_offset(datetime_obj, utc_offset) if utc_offset else datetime_obj
762769
return datetime_obj
763770

764-
def strptime_dcm_dt(dcm_data: dcm.Dataset, dt_tag: TagType) -> datetime:
771+
772+
def strptime_dcm_dt(dcm_data: dcm.Dataset, dt_tag: TagType) -> datetime.datetime:
765773
r"""
766774
Create a datetime object from a dicom DT tag.
767775
@@ -779,13 +787,13 @@ def strptime_dcm_dt(dcm_data: dcm.Dataset, dt_tag: TagType) -> datetime:
779787
"%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"]
780788
datetime_obj = strptime(datetime_str, fmts)
781789

782-
if utc_offset_dcm := dcm_data.get([0x0008, 0x0201]):
790+
if utc_offset_dcm := dcm_data.get((0x0008, 0x0201)):
783791
if utc_offset := utc_offset_dcm.value.strip():
784-
datetime_obj2 = datetime_utc_offset(datetime_obj, utc_offset)
785-
if datetime_obj.tzinfo and datetime_obj2 != datetime_obj:
786-
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)
787-
else:
788-
datetime_obj = datetime_obj2
792+
datetime_obj2 = datetime_utc_offset(datetime_obj, utc_offset)
793+
if datetime_obj.tzinfo and datetime_obj2 != datetime_obj:
794+
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)
795+
else:
796+
datetime_obj = datetime_obj2
789797
return datetime_obj
790798

791799

0 commit comments

Comments
 (0)