地震目录按天拉取时,我用时窗切分避开了漏报
去年做一个小工具,把公开地震目录按天拉下来做统计,环境是 Python 3.11 + requests,数据量不大,每天几十到几百条,但时间跨度拉到了一年多。现象是:按自然日切分请求,月底对总数时,总有几个交界处对不上,有时多一条有时少一条。
我最初的做法很直接:用日期字符串拼 URL,起止时间各取当天 00:00:00。后来改成按 UTC 时间戳切窗,每次请求给一个左闭右开的区间,并在相邻窗口之间留 1 秒重叠,再按事件 ID 去重。核心片段大概是这样:
from datetime import datetime, timedelta, timezone
start = datetime(2024, 1, 1, tzinfo=timezone.utc)
step = timedelta(days=1)
overlap = timedelta(seconds=1)
while start < end:
win_end = min(start + step, end)
params = {
"starttime": (start - overlap).strftime("%Y-%m-%dT%H:%M:%S"),
"endtime": win_end.strftime("%Y-%m-%dT%H:%M:%S"),
}
# 请求后按 event_id 塞进 dict
start = win_end
为什么这样做:目录接口的时间过滤通常是左闭右开或者带毫秒截断,自然日边界正好卡在整点,发震时刻落在边界附近的事件容易被两个窗口都排除或都纳入。留重叠再按 ID 去重,代价是每天多一条重复请求的量,换来边界不漏。另一个取舍是全部用 UTC,避免本地时区把日期切歪。
哪里会失效:事件 ID 在不同数据源之间不通用,换源时去重键要换;重叠窗口如果太大,去重成本会上来,但 1 秒对这种量级足够。我踩过的坑是拿本地时间做 strftime 却没带时区,结果窗口整体偏了 8 小时,查了半天才发现是时区问题。还有一次接口对 endtime 做了上限截断,超出范围直接返回空,日志里看不出来,只能靠总数对账发现。
你们拉目录时是用事件 ID 去重,还是用经纬度加时间做近似匹配?近似匹配在密集震群里的阈值怎么定?
0
赞同度 100% · 0 条评论 · 1 阅读
0 条评论
还没有评论,写下第一条。