fix: extract obs time from rawOb instead of rounded reportTime for precision
This commit is contained in:
@@ -251,9 +251,42 @@ class WeatherDataCollector:
|
|||||||
latest = data[0]
|
latest = data[0]
|
||||||
temp_c = latest.get("temp")
|
temp_c = latest.get("temp")
|
||||||
dewp_c = latest.get("dewp")
|
dewp_c = latest.get("dewp")
|
||||||
obs_time = latest.get("reportTime", "")
|
|
||||||
|
|
||||||
# 2. 精确计算“当地今天”的最高温
|
# 从 rawOb 中提取真实观测时间(比 reportTime 更准确,reportTime 会被取整)
|
||||||
|
# rawOb 格式: "METAR EGLC 271150Z AUTO ..." → "271150Z" → 27日11:50 UTC
|
||||||
|
def _parse_rawob_time(obs):
|
||||||
|
"""从 rawOb 中提取精确的 UTC 观测时间"""
|
||||||
|
raw = obs.get("rawOb", "")
|
||||||
|
import re as _re
|
||||||
|
m = _re.search(r'\b(\d{2})(\d{2})(\d{2})Z\b', raw)
|
||||||
|
if m:
|
||||||
|
day, hour, minute = int(m.group(1)), int(m.group(2)), int(m.group(3))
|
||||||
|
# 用 reportTime 的日期部分 + rawOb 的时分
|
||||||
|
fallback = obs.get("reportTime", "")
|
||||||
|
try:
|
||||||
|
clean = fallback.replace(" ", "T")
|
||||||
|
if not clean.endswith("Z"): clean += "Z"
|
||||||
|
base_dt = datetime.fromisoformat(clean.replace("Z", "+00:00"))
|
||||||
|
result = base_dt.replace(hour=hour, minute=minute, second=0)
|
||||||
|
# 处理跨日(如 rawOb 是23:50但 reportTime 已经是次日00:00)
|
||||||
|
if result > base_dt + timedelta(hours=2):
|
||||||
|
result -= timedelta(days=1)
|
||||||
|
return result
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
# fallback 到 reportTime
|
||||||
|
fallback = obs.get("reportTime", "")
|
||||||
|
try:
|
||||||
|
clean = fallback.replace(" ", "T")
|
||||||
|
if not clean.endswith("Z"): clean += "Z"
|
||||||
|
return datetime.fromisoformat(clean.replace("Z", "+00:00"))
|
||||||
|
except:
|
||||||
|
return None
|
||||||
|
|
||||||
|
obs_dt = _parse_rawob_time(latest)
|
||||||
|
obs_time = obs_dt.strftime("%Y-%m-%dT%H:%M:%S.000Z") if obs_dt else latest.get("reportTime", "")
|
||||||
|
|
||||||
|
# 2. 精确计算"当地今天"的最高温
|
||||||
from datetime import timezone, timedelta
|
from datetime import timezone, timedelta
|
||||||
now_utc = datetime.now(timezone.utc)
|
now_utc = datetime.now(timezone.utc)
|
||||||
local_now = now_utc + timedelta(seconds=utc_offset)
|
local_now = now_utc + timedelta(seconds=utc_offset)
|
||||||
@@ -263,18 +296,15 @@ class WeatherDataCollector:
|
|||||||
max_so_far_c = -999
|
max_so_far_c = -999
|
||||||
max_temp_time = None
|
max_temp_time = None
|
||||||
for obs in data:
|
for obs in data:
|
||||||
obs_report_time = obs.get("reportTime", "")
|
obs_dt_iter = _parse_rawob_time(obs)
|
||||||
|
if obs_dt_iter is None:
|
||||||
|
continue
|
||||||
try:
|
try:
|
||||||
clean_time = obs_report_time.replace(" ", "T")
|
if obs_dt_iter >= utc_midnight:
|
||||||
if not clean_time.endswith("Z"): clean_time += "Z"
|
|
||||||
report_dt = datetime.fromisoformat(clean_time.replace("Z", "+00:00"))
|
|
||||||
|
|
||||||
if report_dt >= utc_midnight:
|
|
||||||
t = obs.get("temp")
|
t = obs.get("temp")
|
||||||
if t is not None and t > max_so_far_c:
|
if t is not None and t > max_so_far_c:
|
||||||
max_so_far_c = t
|
max_so_far_c = t
|
||||||
# 转为当地时间并记录
|
local_report = obs_dt_iter + timedelta(seconds=utc_offset)
|
||||||
local_report = report_dt + timedelta(seconds=utc_offset)
|
|
||||||
max_temp_time = local_report.strftime("%H:%M")
|
max_temp_time = local_report.strftime("%H:%M")
|
||||||
except:
|
except:
|
||||||
continue
|
continue
|
||||||
@@ -282,17 +312,12 @@ class WeatherDataCollector:
|
|||||||
# 3. 提取最近 4 条报文的温度(用于趋势分析)
|
# 3. 提取最近 4 条报文的温度(用于趋势分析)
|
||||||
recent_temps_raw = [] # [(local_time_str, temp_c), ...]
|
recent_temps_raw = [] # [(local_time_str, temp_c), ...]
|
||||||
for obs in data[:4]: # data 已按时间倒序
|
for obs in data[:4]: # data 已按时间倒序
|
||||||
obs_rt = obs.get("reportTime", "")
|
|
||||||
obs_temp = obs.get("temp")
|
obs_temp = obs.get("temp")
|
||||||
if obs_temp is not None:
|
if obs_temp is not None:
|
||||||
try:
|
obs_dt_iter = _parse_rawob_time(obs)
|
||||||
ct = obs_rt.replace(" ", "T")
|
if obs_dt_iter:
|
||||||
if not ct.endswith("Z"): ct += "Z"
|
local_rt = obs_dt_iter + timedelta(seconds=utc_offset)
|
||||||
rdt = datetime.fromisoformat(ct.replace("Z", "+00:00"))
|
|
||||||
local_rt = rdt + timedelta(seconds=utc_offset)
|
|
||||||
recent_temps_raw.append((local_rt.strftime("%H:%M"), obs_temp))
|
recent_temps_raw.append((local_rt.strftime("%H:%M"), obs_temp))
|
||||||
except:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# 转换为单位
|
# 转换为单位
|
||||||
if use_fahrenheit:
|
if use_fahrenheit:
|
||||||
|
|||||||
Reference in New Issue
Block a user