python-ogn-client/ogn/parser/utils.py

62 wiersze
2.5 KiB
Python

from datetime import datetime, timedelta
from ogn.parser.exceptions import AmbigousTimeError
kmh2kts = 0.539957
feet2m = 0.3048
ms2fpm = 196.85
kts2kmh = 1 / kmh2kts
m2feet = 1 / feet2m
fpm2ms = 1 / ms2fpm
def parseAngle(dddmmhht):
return float(dddmmhht[:3]) + float(dddmmhht[3:]) / 60
def createTimestamp(timestamp, reference_date, reference_time=None):
if timestamp[-1] == "z":
day = int(timestamp[0:2])
hhmm = timestamp[2:6]
if reference_date.day < day:
if reference_date.month == 1:
reference_date = reference_date.replace(year=reference_date.year - 1, month=12, day=day)
else:
reference_date = reference_date.replace(month=reference_date.month - 1, day=day)
else:
reference_date = reference_date.replace(day=day)
packet_time = datetime.strptime(hhmm, '%H%M').time()
return datetime.combine(reference_date, packet_time)
elif timestamp[-1] == "h":
hhmmss = timestamp[:-1]
packet_time = datetime.strptime(hhmmss, '%H%M%S').time()
else:
raise ValueError()
if reference_time is None:
return datetime.combine(reference_date, packet_time)
else:
reference_datetime = datetime.combine(reference_date, reference_time)
timestamp = datetime.combine(reference_date, packet_time)
delta = timestamp - reference_datetime
# This function reconstructs the packet date from the timestamp and a reference_datetime time.
# delta vs. packet date:
# -24h -12h 0 +12h +24h
# |-------------------------|---------------------|------------------------|----------------------|
# [-] <-- tomorrow [---------today---------] [-------yesterday------]
if timedelta(hours=-12) <= delta <= timedelta(minutes=30):
# Packet less than 12h from the past or 30min from the future
return timestamp
elif delta < timedelta(hours=-23, minutes=-30):
# Packet from next day, less than 30min from the future
return datetime.combine(reference_datetime + timedelta(hours=+12), packet_time)
elif timedelta(hours=12) < delta:
# Packet from previous day, less than 12h from the past
return datetime.combine(reference_datetime + timedelta(hours=-12), packet_time)
else:
raise AmbigousTimeError(reference_datetime, packet_time)