如何用R或Python批量获取多国节假日并生成带ISO码的数据表
需求说明
希望通过循环或最高效的方式遍历R(或Python)中的一系列日历,输出所有节假日(后续还计划覆盖所有工作日、标记周末,分两部分实现),最终目标得到结构如下的DataFrame:
Country | ISO Code (if available) | Dates United States of America| US| 12.24.2020 United States of America| US| 12.25.2020 United States of America| US| 01.01.2021 United Kingdom| UK| 12.24.2020 United Kingdom| UK| 12.25.2020 United Kingdom| UK| 01.01.2021
问题修复方案
R端修复
原函数只能接收单个日历名称参数,直接传入列表会报错,用迭代函数批量处理即可,修改后代码如下:
library(RcppQuantuccia) library(tidyverse) library(data.table) fun_Holidays <- function(cal) { setCalendar(cal) dt <- data.table( Country = cal, `ISO Code (if available)` = NA_character_, # 可手动补充日历名和ISO码的映射表替换NA Dates = getHolidays(as.Date("2019-01-01"), as.Date("2030-12-31")) ) # 转换为你需要的日期格式 dt$Dates <- format(dt$Dates, "%m.%d.%Y") return(dt) } # 批量遍历所有可用日历,合并为总表 all_holidays_r <- rbindlist(lapply(calendars, fun_Holidays))
Python端修复
你代码里的code变量没有在循环内动态赋值,默认用了全局环境的固定值,才会所有行都显示NZ,补充国家名到ISO码的映射即可,修改后代码如下:
import pandas as pd import numpy as np import holidays import pycountry # 构造国家名到ISO 2位码的映射 def get_iso_code(country_name): try: return pycountry.countries.lookup(country_name).alpha_2 except: # 特殊地区手动匹配 special_map = { "England": "GB-ENG", "Scotland": "GB-SCT", "Wales": "GB-WLS", "NorthernIreland": "GB-NIR", "HongKong": "HK", "Curacao": "CW", "PortugalExt": "PT", "IsleOfMan": "IM", "Korea": "KR" } return special_map.get(country_name, np.nan) all_holidays = [] country_list = ['Angola','Argentina','Aruba','Australia','Austria','Bangladesh','Belarus','Belgium','Botswana','Brazil', 'Bulgaria','Burundi','Canada','Chile','China','Colombia','Croatia','Curacao','Czechia','Denmark','Djibouti','DominicanRepublic', 'Egypt','England','Estonia','Finland','France','Georgia','Germany','Greece','Honduras','HongKong','Hungary','Iceland','India','Ireland','IsleOfMan', 'Israel','Italy','Jamaica','Japan','Kenya','Korea','Latvia','Lesotho','Lithuania','Luxembourg','Malaysia','Malawi','Mexico','Morocco','Mozambique','Netherlands', 'Namibia','NewZealand','Nicaragua','Nigeria','NorthernIreland','Norway','Paraguay','Peru','Poland','Portugal','PortugalExt','Romania','Russia','SaudiArabia','Scotland', 'Serbia','Singapore','Slovakia','Slovenia','SouthAfrica','Spain','Swaziland','Sweden','Switzerland','Turkey','Ukraine','UnitedArabEmirates','UnitedKingdom', 'UnitedStates','Venezuela','Vietnam','Wales','Zambia','Zimbabwe'] for country in country_list: code = get_iso_code(country) for date, holiday_name in holidays.CountryHoliday(country, years = np.arange(2018,2030,1)).items(): all_holidays.append({ 'Country': country, 'ISO Code (if available)': code, 'Dates': date.strftime("%m.%d.%Y") }) all_holidays_df = pd.DataFrame(all_holidays)[["Country", "ISO Code (if available)", "Dates"]]
如果要使用workalendar导出总表,核心逻辑和上述实现一致,循环遍历workalendar的所有国家类、提取指定年份的节假日整理为目标结构即可。
内容的提问来源于stack exchange,提问作者Billpete002
相关产品推荐
相关产品推荐

