diff --git a/lib/xmet/raob.py b/lib/xmet/raob.py index 547dea0..5ffad9d 100644 --- a/lib/xmet/raob.py +++ b/lib/xmet/raob.py @@ -122,8 +122,12 @@ class RAOBSounding(): return 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, pressure: float, @@ -133,8 +137,12 @@ class RAOBSounding(): return 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(): DATA_SOURCE = 'UCAR' @@ -313,9 +321,22 @@ class RAOBObs(): code, pressure = token[0:2], token[2:5] 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 ret['pressure'] = value @@ -335,12 +356,12 @@ class RAOBObs(): wind = self.parse_wind(tokens[2]) return { - 'pressure': hp['pressure'], - 'height': hp['height'], - 'temp': td['temp'], - 'dewpoint': td['dewpoint'], - 'wind_speed': wind['speed'], - 'wind_dir': wind['dir'] + 'pressure': hp.get('pressure'), + 'height': hp.get('height'), + 'temp': td.get('temp'), + 'dewpoint': td.get('dewpoint'), + 'wind_speed': wind.get('speed'), + 'wind_dir': wind.get('dir') } def parse_ttaa(self) -> dict: @@ -360,20 +381,29 @@ class RAOBObs(): station = self.tokens[1] samples = list() - for i in range(2, len(self.tokens), 3): + i = 2 + + while i < len(self.tokens): if len(self.tokens) < i+3: 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 - 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: - samples.append(sample) + if sample is not None: + samples.append(sample) + + i += 3 + else: + i += 1 return { 'station': station, @@ -382,18 +412,21 @@ class RAOBObs(): } def parse_ttbb_sample(self, tokens: list[str]) -> dict: + if tokens[0] == 'NIL': + return {} + hp = self.parse_pressure(tokens[0]) ret = { - 'pressure': hp['pressure'], + 'pressure': hp.get('pressure'), 'temp': None, 'dewpoint': None } if len(tokens) > 1: td = self.parse_temp_dewpoint(tokens[1]) - ret['temp'] = td['temp'] - ret['dewpoint'] = td['dewpoint'] + ret['temp'] = td.get('temp') + ret['dewpoint'] = td.get('dewpoint') return ret @@ -402,8 +435,17 @@ class RAOBObs(): station = self.tokens[1] samples = list() - for i in range(2, len(self.tokens), 2): - samples.append(self.parse_ttbb_sample(self.tokens[i:i+2])) + 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 { 'station': station,