Fix issues with misaligned samples

This commit is contained in:
XANTRONIX 2025-03-29 16:52:51 -04:00
parent 8bea18af4d
commit aca0547b93

View file

@ -122,8 +122,12 @@ class RAOBSounding():
return return
sample = self.sample_by_pressure(pressure) sample = self.sample_by_pressure(pressure)
sample.temp = temp
sample.dewpoint = dewpoint if sample.temp is None:
sample.temp = temp
if sample.dewpoint is None:
sample.dewpoint = dewpoint
def record_wind_speed_dir(self, def record_wind_speed_dir(self,
pressure: float, pressure: float,
@ -133,8 +137,12 @@ class RAOBSounding():
return return
sample = self.sample_by_pressure(pressure) sample = self.sample_by_pressure(pressure)
sample.wind_speed = wind_speed
sample.wind_dir = wind_dir if sample.wind_speed is None:
sample.wind_speed = wind_speed
if sample.wind_dir is None:
sample.wind_dir = wind_dir
class RAOBObs(): class RAOBObs():
DATA_SOURCE = 'UCAR' DATA_SOURCE = 'UCAR'
@ -313,9 +321,22 @@ class RAOBObs():
code, pressure = token[0:2], token[2:5] code, pressure = token[0:2], token[2:5]
if pressure != '///' and code in self.PRESSURE_CODES: if pressure != '///' and code in self.PRESSURE_CODES:
value = float(pressure) p100 = pressure[0]
p10 = pressure[1]
p1 = pressure[2]
if value < 100: value = 0.0
if p100 != '/':
value += 100.0 * int(p100)
if p10 != '/':
value += 10.0 * int(p10)
if p1 != '/':
value += int(p1)
if value < 100.0:
value += 1000.0 value += 1000.0
ret['pressure'] = value ret['pressure'] = value
@ -335,12 +356,12 @@ class RAOBObs():
wind = self.parse_wind(tokens[2]) wind = self.parse_wind(tokens[2])
return { return {
'pressure': hp['pressure'], 'pressure': hp.get('pressure'),
'height': hp['height'], 'height': hp.get('height'),
'temp': td['temp'], 'temp': td.get('temp'),
'dewpoint': td['dewpoint'], 'dewpoint': td.get('dewpoint'),
'wind_speed': wind['speed'], 'wind_speed': wind.get('speed'),
'wind_dir': wind['dir'] 'wind_dir': wind.get('dir')
} }
def parse_ttaa(self) -> dict: def parse_ttaa(self) -> dict:
@ -360,20 +381,29 @@ class RAOBObs():
station = self.tokens[1] station = self.tokens[1]
samples = list() samples = list()
for i in range(2, len(self.tokens), 3): i = 2
while i < len(self.tokens):
if len(self.tokens) < i+3: if len(self.tokens) < i+3:
break break
prefix = self.tokens[i][0:2]
# #
# Stop parsing tokens at the tropopause. # Stop parsing tokens at the tropopause
# #
if self.tokens[i][0:2] == '88': if prefix == '88':
break break
sample = self.parse_ttaa_sample(self.tokens[i:i+3]) if prefix in self.PRESSURE_CODES:
sample = self.parse_ttaa_sample(self.tokens[i:i+3])
if sample is not None: if sample is not None:
samples.append(sample) samples.append(sample)
i += 3
else:
i += 1
return { return {
'station': station, 'station': station,
@ -382,18 +412,21 @@ class RAOBObs():
} }
def parse_ttbb_sample(self, tokens: list[str]) -> dict: def parse_ttbb_sample(self, tokens: list[str]) -> dict:
if tokens[0] == 'NIL':
return {}
hp = self.parse_pressure(tokens[0]) hp = self.parse_pressure(tokens[0])
ret = { ret = {
'pressure': hp['pressure'], 'pressure': hp.get('pressure'),
'temp': None, 'temp': None,
'dewpoint': None 'dewpoint': None
} }
if len(tokens) > 1: if len(tokens) > 1:
td = self.parse_temp_dewpoint(tokens[1]) td = self.parse_temp_dewpoint(tokens[1])
ret['temp'] = td['temp'] ret['temp'] = td.get('temp')
ret['dewpoint'] = td['dewpoint'] ret['dewpoint'] = td.get('dewpoint')
return ret return ret
@ -402,8 +435,17 @@ class RAOBObs():
station = self.tokens[1] station = self.tokens[1]
samples = list() samples = list()
for i in range(2, len(self.tokens), 2): i = 2
samples.append(self.parse_ttbb_sample(self.tokens[i:i+2]))
while i < len(self.tokens):
prefix = self.tokens[i][0:2]
if prefix in self.PRESSURE_CODES:
samples.append(self.parse_ttbb_sample(self.tokens[i:i+2]))
i += 2
else:
i += 1
return { return {
'station': station, 'station': station,