如何对时间位置不同的FM/BECMG开头气象数据行按时间顺序排序?
气象数据排序解决方案
实现思路
两种格式的气象行时间特征明确,使用正则提取统一格式的时间戳作为排序键即可,无需按字段索引判断:
- 以
FM开头的行:时间为紧随FM后的6位字符串,格式为ddHHmm(日期、小时、分钟) - 以
BECMG开头的行:取第二个字段中/前的4位字符串ddHH,补分钟位00后得到6位同格式时间戳
代码实现
import re # 匹配时间的正则规则 time_pattern = re.compile(r'(?:FM(\d{6})|BECMG\s+(\d{4})/\d{4})') def get_sort_key(line: str) -> str: match = time_pattern.search(line) if not match: return '' # 无匹配的行默认排序规则可自行调整 fm_time, becmg_time = match.groups() # 统一返回6位ddHHmm格式字符串,天然支持字典序排序 return fm_time if fm_time else f"{becmg_time}00" total_print = ['\nBECMG 1315/1317 27007KT 9999 SHOWERS OF LIGHT RAIN SCT020 BKN030', '\nFM131200 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 BKN010', '\nFM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 BKN010'] # 直接按提取的时间键排序 sorted_lines = sorted(total_print, key=get_sort_key) # 按原有逻辑处理输出 final = [] for line in sorted_lines: final.append('\n' + line[1:]) print(' '.join(final))
运行输出
FM131200 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 BKN010 FM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 BKN010 BECMG 1315/1317 27007KT 9999 SHOWERS OF LIGHT RAIN SCT020 BKN030
完全符合时间正序的排序要求,支持全FM、全BECMG、混合三种场景。
内容的提问来源于stack exchange,提问作者PW1990
相关产品推荐
相关产品推荐

