为报道查找下周发布的数据和最新数值

新闻编辑部需要从 API 获取两样东西:本周将发布的数据日历,以及报道所涉序列的最新已发布数值。日历按 UTC 时间列出每项发布。各国端点会返回最新数值及其 period 和 released_on,报道便能写出正确的参考月份。

获取报道所需的最新数值

每个序列都有对应的国家端点:/v1/economics/{country}/inflation、/cpi、/unemployment 和 /gdp-growth。不带 period 参数时返回最新一期。下面的请求查询美国通胀。

curl,美国通胀最新数值
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/economics/USA/inflation"
响应
{
  "country": "USA",
  "period": "2026-09",
  "year_over_year": "3.7",
  "month_over_month": "0.6",
  "year_to_date": "4.0",
  "released_on": "2026-10-14"
}

这份响应里有两个含义不同的日期。period 是该数值所衡量的参考月份,即 2026-09,也就是 9 月。released_on 是数值公布的日期,即 2026-10-14。10 月发稿的报道应写成:截至 9 月的一年里,物价上涨了 3.7%。如果取 10 月的发布日期,月份就错了。

三个变化率字段是各自独立的指标:year_over_year 为 3.7,month_over_month 为 0.6,year_to_date 为 4.0,单位均为百分比。每个字段回答的问题不同,所以在行文中要点明引用的是哪一个。

其他序列的同类调用

序列端点返回的字段periodreleased_on
通胀/v1/economics/USA/inflationyear_over_year, month_over_month, year_to_date2026-092026-10-14
消费者价格指数/v1/economics/USA/cpivalue 为 336.940,index_base 为 1982-84=1002026-092026-10-14
失业率/v1/economics/USA/unemploymentrate 4.22026-092026-10-02
GDP 增长率/v1/economics/USA/gdp-growthyear_over_year 2.1, quarter_over_quarter 0.8322026-Q32026-10-29

GDP 增长使用季度作为 period,所以 2026-Q3 表示第三季度。写与上一季度相比的增长时用 quarter_over_quarter,与上年同期相比时用 year_over_year。

把新数值与旧数值并列

日历中的每项发布都带有 values[].previous,即新发布将与之比较的数值。发布当天,报道可以引用日历中的 previous 值,以及公布后从国家端点取得的新值。请核对日历数值的 transformation(例如 year_over_year),确保两个数字属于同一类。

生成简报:本周发布数据加最新数值

该脚本向日历请求 11 月 9 日至 13 日的美国数据,按纽约时间打印每项发布,再获取通胀、失业率和 GDP 的最新数值,并用文字写出参考期。

  1. 获取 API 密钥 在注册页获取 API 密钥,并保存在 NARWHAL_API_KEY 中。
  2. 列出本周发布 GET /v1/economics/calendar 不会按时间顺序返回发布数据。脚本保留带有 at 时间的条目,排序后转换为发布机构的 timezone。
  3. 获取各序列的最新数值 每个序列调用一次。say 函数把 2026-09 转成 2026 年 9 月,把 2026-Q3 转成 2026 年第三季度,因此句子用的是 period,绝不会用 released_on 的月份。
    Python,报道用的每周简报
    import os
    from datetime import datetime
    from zoneinfo import ZoneInfo
    import requests
    
    API = "https://api.narwhalapi.com"
    HEADERS = {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"}
    MONTHS = ["January", "February", "March", "April", "May", "June", "July",
              "August", "September", "October", "November", "December"]
    QUARTERS = {"Q1": "first", "Q2": "second", "Q3": "third", "Q4": "fourth"}
    
    
    def get(path, **params):
        r = requests.get(f"{API}/v1/economics/{path}", headers=HEADERS, params=params, timeout=10)
        r.raise_for_status()
        return r.json()
    
    
    def say(period):
        year, part = period.split("-")
        if part in QUARTERS:
            return f"the {QUARTERS[part]} quarter of {year}"
        return f"{MONTHS[int(part) - 1]} {year}"
    
    
    week = get("calendar", countries="USA", start_date="2026-11-09", end_date="2026-11-13", limit=100)
    for x in sorted((x for x in week["releases"] if "at" in x), key=lambda x: x["at"]):
        local = datetime.fromisoformat(x["at"].replace("Z", "+00:00")).astimezone(ZoneInfo(x["timezone"]))
        print(local.strftime("%a %d %b %H:%M"), x["name"], "|", x.get("period", "no period"))
    
    for series in ("inflation", "unemployment", "gdp-growth"):
        d = get(f"USA/{series}")
        figures = {k: v for k, v in d.items() if k not in ("country", "period", "released_on")}
        print(series, figures, "for", say(d["period"]), "released", d["released_on"])
脚本输出
Mon 09 Nov 10:00 Wholesale trade | 2026-09
Tue 10 Nov 08:30 Wages and earnings | 2026-10
Tue 10 Nov 08:30 Consumer prices | 2026-10
Thu 12 Nov 08:30 Jobless claims | 2026-11-07
Thu 12 Nov 12:00 Petroleum inventories | no period
Thu 12 Nov 14:00 Public finances | 2026-10
Fri 13 Nov 08:30 Producer prices | 2026-10
inflation {'year_over_year': '3.7', 'month_over_month': '0.6', 'year_to_date': '4.0'} for September 2026 released 2026-10-14
unemployment {'rate': '4.2'} for September 2026 released 2026-10-02
gdp-growth {'year_over_year': '2.1', 'quarter_over_quarter': '0.832'} for the third quarter of 2026 released 2026-10-29

11 月 10 日(周二)发布的消费者价格数据对应 2026-10,是 10 月的数值。在它公布之前,最新的通胀数值仍是 released_on 为 2026-10-14 的 9 月数据。公布之后,无需修改请求,端点就会返回新的一期。

正确写出参考期

最新数值period表述方式
通胀 3.7%2026-09截至 9 月的一年里,物价上涨了 3.7%
失业率 4.2%2026-099 月的失业率为 4.2%
GDP 增长 2.1%2026-Q3第三季度经济同比增长 2.1%
  • 月份或季度要取自 period,绝不要取自 released_on。通胀数值在 10 月公布,但反映的是 9 月。
  • 要说明引用的是哪种比较:year_over_year、month_over_month、year_to_date 或 quarter_over_quarter。字段名就是标签。
  • 在“数据于当日公布”这类句子里使用 released_on,读者就能看出数值有多新。

为什么日历中的期间与最新数值的期间不同?

日历中的 period 是该项发布将要涵盖的月份,而最新数值是已经公布的最近一次发布。在简报输出里,日历列出的消费者价格对应 2026-10,而通胀端点返回的是 2026-09。在写某个数值是最新之前,请先核对两者。

inflation 和 cpi 端点有什么区别?

/inflation 返回以百分比表示的变化率。/cpi 在 value 中返回指数水平,在 index_base 中返回基期。标题里引用变化率,只有当报道本身讲指数时才引用指数水平。

所有国家的失业率都按同一种期间发布吗?

不是。美国的失业率返回的是 2026-09,是一个月;而德国返回的是 2026-Q2,是一个季度。要在同一句话里比较数值,请先查看每个国家的 period。

发布于。

后续步骤