diff --git a/geomagio/residual/SpreadsheetSummaryFactory.py b/geomagio/residual/SpreadsheetSummaryFactory.py index fe6b4fdf1d7f0beacdf9fa6311e0efa202bbdd23..265807861250dd438fd8a9b36330fb1c2669e7b0 100644 --- a/geomagio/residual/SpreadsheetSummaryFactory.py +++ b/geomagio/residual/SpreadsheetSummaryFactory.py @@ -7,7 +7,32 @@ from typing import List from .Absolute import Absolute from . import Angle from .Reading import Reading -from .SpreadsheetAbsolutesFactory import parse_relative_time + + +def parse_relative_time(base_date: str, time: str) -> UTCDateTime: + """Parse a relative date. + + Arguments + --------- + base_date: date when time occurs (YYYYMMDD) + time: time on base_date (HHMMSS) or (HHMM) + """ + try: + time = "{0:04d}".format(time) + return UTCDateTime(f"{base_date}T{time}") + except Exception as e: + print(f"error parsing relative date '{base_date}T{time}': {e}") + return None + + +def convert_baseline( + baseline: float = 0, +) -> float: + """Convert basline from minutes to seconds""" + try: + return baseline / 60 + except: + pass class SpreadsheetSummaryFactory(object): @@ -78,14 +103,21 @@ class SpreadsheetSummaryFactory(object): Outputs ------- - List of valid readings from spreadsheet. - If all readings are valid, 4 readings are returned + List of readings from spreadsheet. + Readings are returned regardless of if they are valid. """ metadata = self._parse_metadata(sheet) date = sheet["I1"].value base_date = f"{date.year}{date.month:02}{date.day:02}" readings = [] - for d_n in range(10, 14): + sets_len = len( + [ + sheet.cell(row=i, column=3).value + for i in range(10, 14) + if sheet.cell(row=i, column=3).value is not None + ] + ) + for d_n in range(10, 10 + sets_len): h_n = d_n + 14 v_n = d_n + 28 absolutes = [ @@ -94,12 +126,12 @@ class SpreadsheetSummaryFactory(object): absolute=Angle.from_dms( degrees=sheet[f"C{d_n}"].value, minutes=sheet[f"D{d_n}"].value ), - baseline=sheet[f"H{d_n}"].value / 60, + baseline=convert_baseline(sheet[f"H{d_n}"].value), starttime=parse_relative_time( - base_date, "{0:04d}".format(sheet[f"B{v_n}"].value) + base_date, time=(sheet[f"B{v_n}"].value) ), endtime=parse_relative_time( - base_date, "{0:04d}".format(sheet[f"B{d_n}"].value) + base_date, time=(sheet[f"B{d_n}"].value) ), valid=not bool(sheet[f"J{d_n}"].value), ), @@ -108,10 +140,10 @@ class SpreadsheetSummaryFactory(object): absolute=sheet[f"D{h_n}"].value, baseline=sheet[f"H{h_n}"].value, starttime=parse_relative_time( - base_date, "{0:04d}".format(sheet[f"B{v_n}"].value) + base_date, time=(sheet[f"B{v_n}"].value) ), endtime=parse_relative_time( - base_date, "{0:04d}".format(sheet[f"B{h_n}"].value) + base_date, time=(sheet[f"B{h_n}"].value) ), valid=not bool(sheet[f"J{h_n}"].value), ), @@ -120,10 +152,10 @@ class SpreadsheetSummaryFactory(object): absolute=sheet[f"D{v_n}"].value, baseline=sheet[f"H{v_n}"].value, starttime=parse_relative_time( - base_date, "{0:04d}".format(sheet[f"B{v_n}"].value) + base_date, time=(sheet[f"B{v_n}"].value) ), endtime=parse_relative_time( - base_date, "{0:04d}".format(sheet[f"B{v_n}"].value) + base_date, time=(sheet[f"B{v_n}"].value) ), valid=not bool(sheet[f"J{d_n}"].value), ),