2026 年,美国有 11 个节假日,英国有 14 个,日本有 18 个,德国有 9 个,印度尼西亚有 17 个,五国唯一共同的假日日期是 1 月 1 日。遍历国家代码,为每个国家和年份发送一次请求,再按假日日期汇总国家,以比较各国日历。
使用 API 完成操作
- 获取密钥并设置环境变量 在注册页面获取免费密钥,并将其保存在名为
NARWHAL_API_KEY的环境变量中。脚本读取该变量,并以Authorization: Bearer YOUR_KEY的形式发送密钥,因此请在运行 Python 的环境中设置该变量。 - 选择国家和年份 在
GET /v1/calendars/holidays/{country}/{year}中使用 ISO 3166 alpha-3 国家代码:示例请求USA、GBR、JPN、DEU和IDN的 2026 年数据。每个国家和年份都需要单独请求,因此这次比较共发送五次请求;请为要比较的国家使用相同年份。 - 按日期汇总国家 运行 Python 脚本,请求各国假日并按
date对响应条目分组,为每个日期建立一个国家代码集合。脚本将日期排序,输出至少三个国家共有的日期,再从完整集合中统计每个国家的不重复日期数,包括未出现在共同日期输出中的日期。import os from collections import defaultdict import requests HEADERS = {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"} COUNTRIES = ["USA", "GBR", "JPN", "DEU", "IDN"] by_date = defaultdict(set) for country in COUNTRIES: r = requests.get(f"https://api.narwhalapi.com/v1/calendars/holidays/{country}/2026", params={"scope": "national_public"} if country == "IDN" else None, headers=HEADERS, timeout=10) r.raise_for_status() for h in r.json()["holidays"]: by_date[h["date"]].add(country) for day in sorted(by_date): if len(by_date[day]) >= 3: print(day, sorted(by_date[day])) print({c: sum(1 for d in by_date.values() if c in d) for c in COUNTRIES}) - 查看共同日期和各国总数 对于 2026 年,共同日期输出包含 1 月 1 日、4 月 3 日、5 月 25 日和 12 月 25 日,最后一行包含各国的不重复日期总数。这些总数使用美国的
federal_government范围、英国的bank范围以及日本和德国的national_public范围;印度尼西亚的请求明确选择national_public。
请分别查看共同日期的国家列表和假日名称。2026 年 5 月 25 日是德国、英国和美国共同的假日日期;在美国,这一天是阵亡将士纪念日。脚本按日期分组,因此日期匹配不要求各国使用相同的假日名称。2026 年 4 月 3 日的耶稣受难日出现在德国、英国和印度尼西亚的日历中,因此该日期也达到共同日期的筛选门槛。其国家列表包含 DEU、GBR 和 IDN。
使用电子表格或手动计算
打开各国的假日日历页面 (英语),即可在不使用脚本的情况下比较日期。如需在电子表格中比较,请将每个国家的日期粘贴到单独的一列,并在各国列中为每个不同日期仅保留一个条目。将要比较的日期放在 A2 中,其他国家的日期列表放在 B:E 列中。
=COUNTIF(B:E, A2)公式统计其他国家列中匹配的单元格数。A 列所属国家已由 A2 中的日期表示,因此公式结果表示表格其他位置的匹配数。粘贴时请将每个国家的日期放在一起,以便追溯匹配结果对应的日历。将公式复制到 A 列待比较日期旁边的单元格中。请结合该行日期查看每个结果;公式会在其他列中搜索相同日期,因此各列列表无需按行对齐。
不同情况应选哪种方法
| 情况 | 最合适的方法 | 原因 |
|---|---|---|
| 一次性比较两个或三个国家 | 日历页面 | 直接查看各国假日日期 |
| 建立团队日历或处理跨办公室薪资 | 脚本,每个国家每年运行一次 | 按日期汇总国家并统计不重复日期数 |
| 仅包含部分地区 | 按响应中的 subdivision_codes 筛选 | 选择与比较有关的行政区划 |
为什么英国的行数翻倍了?
银行假日因英国各组成国而异,因此每个日期会为每组行政区划分别出现一次。2026 年,英国响应有 28 行原始数据,因为英格兰和威尔士、北爱尔兰、苏格兰分别列出,而合并后的日历有 14 个不重复日期。需要统计该国的不重复日期总数时,请使用集合收集日期。
对于地区日历,请先使用响应中的 subdivision_codes 选择相关条目,再收集日期。这样可以将地区选择与不重复日期统计分开。
如何排除集体休假日?
为印度尼西亚传入 scope=national_public,即可排除当地的集体休假日。对于 2026 年,筛选后有 17 个不重复的节假日日期,未筛选的响应则有 25 行,因为其中还包含 collective_leave 条目。在这次比较中,应在印度尼西亚的请求中设置范围参数。
将日期加入合并集合前,请先应用范围筛选。否则,在比较共同日期或统计该国假日时,印度尼西亚的条目会包含集体休假。
各国对周末假日的统计方式相同吗?
不同,各国列表使用各自规定的日期。有些国家会将假日移至工作周内,并标记为 observed。比较时请使用响应中的日期,包括其中的补假日期,避免对所有国家的周末假日统一套用同一套调休规则。
示例:2026 年 12 月 25 日
以 2026 年 12 月 25 日为例,在各国所选的假日列表中查找该日期。德国、英国、印度尼西亚和美国各计入一个国家代码;日本在该日期没有假日。每个匹配国家只计入一次,即使其响应中该日期有多行独立的地区条目。
| 国家 | 代码 | 2026 年 12 月 25 日是否为假日 |
|---|---|---|
| 德国 | DEU | 是 |
| 英国 | GBR | 是 |
| 印度尼西亚 | IDN | 是 |
| 美国 | USA | 是 |
| 日本 | JPN | 否 |
| 总计 | DEU, GBR, IDN, USA | 5 个国家中有 4 个 |
统计 2026 年 12 月 25 日的不重复国家代码,可得五个国家中的四个。该日期至少由三个国家共有,因此符合脚本的输出条件。相比之下,2026 年 1 月 1 日包含全部五个国家代码,也是 2026 年五国唯一共同的假日日期。
发布于。
后续步骤
创建免费密钥,在自己的代码中调用 API。 获取免费 API 密钥
