新闻编辑部需要从 API 获取两样东西:本周将发布的数据日历,以及报道所涉序列的最新已发布数值。日历按 UTC 时间列出每项发布。各国端点会返回最新数值及其 period 和 released_on,报道便能写出正确的参考月份。
获取报道所需的最新数值
每个序列都有对应的国家端点:/v1/economics/{country}/inflation、/cpi、/unemployment 和 /gdp-growth。不带 period 参数时返回最新一期。下面的请求查询美国通胀。
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,单位均为百分比。每个字段回答的问题不同,所以在行文中要点明引用的是哪一个。
其他序列的同类调用
| 序列 | 端点 | 返回的字段 | period | released_on |
|---|---|---|---|---|
| 通胀 | /v1/economics/USA/inflation | year_over_year, month_over_month, year_to_date | 2026-09 | 2026-10-14 |
| 消费者价格指数 | /v1/economics/USA/cpi | value 为 336.940,index_base 为 1982-84=100 | 2026-09 | 2026-10-14 |
| 失业率 | /v1/economics/USA/unemployment | rate 4.2 | 2026-09 | 2026-10-02 |
| GDP 增长率 | /v1/economics/USA/gdp-growth | year_over_year 2.1, quarter_over_quarter 0.832 | 2026-Q3 | 2026-10-29 |
GDP 增长使用季度作为 period,所以 2026-Q3 表示第三季度。写与上一季度相比的增长时用 quarter_over_quarter,与上年同期相比时用 year_over_year。
把新数值与旧数值并列
日历中的每项发布都带有 values[].previous,即新发布将与之比较的数值。发布当天,报道可以引用日历中的 previous 值,以及公布后从国家端点取得的新值。请核对日历数值的 transformation(例如 year_over_year),确保两个数字属于同一类。
生成简报:本周发布数据加最新数值
该脚本向日历请求 11 月 9 日至 13 日的美国数据,按纽约时间打印每项发布,再获取通胀、失业率和 GDP 的最新数值,并用文字写出参考期。
- 获取 API 密钥 在注册页获取 API 密钥,并保存在
NARWHAL_API_KEY中。 - 列出本周发布
GET /v1/economics/calendar不会按时间顺序返回发布数据。脚本保留带有at时间的条目,排序后转换为发布机构的timezone。 - 获取各序列的最新数值 每个序列调用一次。
say函数把2026-09转成 2026 年 9 月,把2026-Q3转成 2026 年第三季度,因此句子用的是period,绝不会用released_on的月份。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-2911 月 10 日(周二)发布的消费者价格数据对应 2026-10,是 10 月的数值。在它公布之前,最新的通胀数值仍是 released_on 为 2026-10-14 的 9 月数据。公布之后,无需修改请求,端点就会返回新的一期。
正确写出参考期
| 最新数值 | period | 表述方式 |
|---|---|---|
| 通胀 3.7% | 2026-09 | 截至 9 月的一年里,物价上涨了 3.7% |
| 失业率 4.2% | 2026-09 | 9 月的失业率为 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。
发布于。