历史汇率查询:获取过去某一天的汇率

2026 年 9 月 30 日,1 美元可兑换 17,891.1 印度尼西亚盾。向 observations 端点传入基础货币、报价货币和日期,然后从当天那一行读取汇率。

用 API 获取指定日期的汇率

  1. 选择货币和日期 将基础货币放在 observations 路径中,将报价货币放在 currencies 中;USD 兑 IDR 时,路径用 USD,参数用 IDR。把 start_date 和 end_date 都设为 2026-09-30,即可请求 2026 年 9 月 30 日的观测值,范围两端使用同一个日期。
  2. 设置你的 API 密钥 获取免费密钥,并保存在环境变量 NARWHAL_API_KEY 中。脚本会读取该变量作为 Authorization: Bearer YOUR_KEY 请求头,所以发出请求之前,请先把密钥放进环境。
  3. 请求观测值 使用此处所示的日期参数和授权请求头调用 observations 端点。脚本读取响应中的 observations 数组,并把返回的每一天的日期与 rates 数组一起打印出来,报价货币及其汇率就在 rates 数组中成对出现。
    Python,过去日期的 USD 兑 IDR 汇率
    import os
    import requests
    
    r = requests.get(
        "https://api.narwhalapi.com/v1/fx/rates/USD/observations",
        params={"currencies": "IDR", "start_date": "2026-09-30", "end_date": "2026-09-30"},
        headers={"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"},
        timeout=10,
    )
    r.raise_for_status()
    for day in r.json()["observations"]:
        print(day["date"], day["rates"])
  4. 读取返回的日期和汇率 2026 年 9 月 30 日的输出是 2026-09-30 [{'currency': 'IDR', 'rate': '17891.1'}];在自己的记录中把汇率对应到日期时,请使用返回行上的日期。如果需要一系列日期,请求一个起始日期和一个结束日期,再用 limit 和 next_cursor 对观测值分页,因为一页可能包含很多天。

查询过去的日期请使用 GET /v1/fx/rates/{base}/observations。获取当前汇率的端点是 GET /v1/fx/rates/{base}?currencies=...;带日期的请求应发到 observations 路径,并带上起止参数。

响应包含 base、observations 和 next_cursor。observations 中的每一行都有 date 和 rates 数组,每个汇率都有 currency 和 rate 字段。为表格提取数值时,从观测值中取日期,从 IDR 条目中取数值,保持所请求的报价货币与返回汇率之间的对应关系。

如果请求返回错误,响应体采用 application/problem+json,包含 status、code、detail 和 request_id。在把响应当作观测值之前,先读取错误的 code 和 detail。错误响应体带有这些错误字段;带日期的汇率在成功响应的 observations 数组中。

不用代码查找历史汇率

想手动查某个日期,可以使用显示历史汇率的 Narwhal 货币页面。找到所需的货币和日期,复制到表格时把日期和汇率一起保留。带日期的数值,能让你日后追溯换算所用的那条观测值。

如果是一批日期,把脚本写出的日期和汇率粘贴到表格里,日期放在查找列,汇率放在后面一列。公式中用 date 表示要查的日期,用 table 表示这些列,并把这两个占位符换成你表格中的日期引用和查找范围。末尾的 FALSE 表示精确匹配日期,2 表示取汇率那一列。请把货币对与表格放在一起,这样就知道粘贴的数值属于哪个基础货币和报价货币,并用返回的观测日期作为查找列中的日期。

在表格中查找日期
=VLOOKUP(date, table, 2, FALSE)

不同情况应选哪种方法

情况最合适的方法原因
单个日期,手动查询货币页面货币页面显示历史汇率
日期列表observations 端点请求起止日期,再逐个查找日期

所有账户都能读取完整历史。系列的起点可能晚于你请求的起始日期,所以请查看返回的第一个日期。

如果该日期是周末或节假日怎么办?

如果所请求的日期没有汇率,就取在此之前最近一个有数据行的日期。汇率是每日观测值,周末等没有汇率的日子没有数据行,因此请求某个周六时,不会返回该日期的观测值。

记录是哪条观测值提供了该汇率时,请使用较早那一行的日期。没有观测值的日期如何回退,请参阅发票日期的做法。

汇率是什么意思?

汇率是基础货币每一单位对应的报价货币单位数。在 2026 年 9 月 30 日的 USD/IDR 观测值中,USD 是基础货币、IDR 是报价货币,所以 17,891.1 表示每 1 美元兑多少印度尼西亚盾。把美元金额乘以该日期的汇率,就得到对应的 IDR 金额。

应如何处理带小数的汇率?

做金额运算时,请把返回的汇率保留为小数或字符串。API 返回的是十进制字符串,2026 年 9 月 30 日输出中带引号的 '17891.1' 就是例子。计算中的乘法请使用十进制表示,不要把汇率转换成二进制浮点数。

实例:2026 年 9 月 30 日的 USD/IDR

要用 2026 年 9 月 30 日的观测值换算 1,000 USD,先从该日期的 USD 行中读取 IDR 汇率,再把美元金额乘以每美元 17,891.1 IDR。让日期跟着结果一起保留,这样该金额就能对应到计算时用的历史观测值。在表格里,先在粘贴的日期中查找 2026 年 9 月 30 日,取出其汇率,再把它作为 USD 金额的乘数。

步骤数值
观测日期2026 年 9 月 30 日
基础货币金额1,000 USD
2026年9月30日的汇率每 1 美元 17,891.1 IDR
乘以1,000 USD × 每美元 17,891.1 IDR
报价货币金额17,891,100 IDR

发布于。

后续步骤