如何用Python循环遍历国家列表调用holidays库获取节假日并存入DataFrame?
解决Python holidays库循环获取多国节假日的问题
嘿,我来帮你搞定这个问题!你遇到的AttributeError是因为Python没法直接把变量i当成holidays模块的属性名来用——毕竟holidays.i是不存在的,你得用动态属性获取的方式来调用对应国家的节假日类。下面给你一步步拆解解决方案:
核心问题分析
holidays库的国家节假日类采用两字母ISO国家代码命名(比如美国是holidays.US,法国是holidays.FR),但你的目标列表里混合了全称(如Norway)和三字母代码(如FRA),所以首先需要把这些名称映射到库对应的类名,再通过动态方法调用类。
完整解决方案代码
import holidays import pandas as pd import numpy as np # 第一步:把你的目标国家列表转换成holidays库对应的类名映射 country_mapping = { 'FRA': 'FR', # 法国 'Norway': 'NO', # 挪威 'Finland': 'FI', # 芬兰 'US': 'US', # 美国 'Germany': 'DE', # 德国 'UnitedKingdom': 'GB', # 英国(注意是GB而非UK) 'Sweden': 'SE' # 瑞典 } # 初始化空列表,存储所有国家的节假日数据 all_holidays = [] # 循环遍历每个国家,动态获取节假日数据 for country_name, country_code in country_mapping.items(): # 用getattr动态获取holidays模块中的对应国家类 country_holiday_cls = getattr(holidays, country_code) # 实例化类,获取2014-2029年的节假日 country_holiday_data = country_holiday_cls(years=np.arange(2014, 2030, 1)) # 整理每条节假日数据,添加国家名称后存入总列表 for date, holiday_name in sorted(country_holiday_data.items()): all_holidays.append({ 'Country': country_name, 'Date': date, 'Holiday': holiday_name }) # 转换为DataFrame格式 holidays_df = pd.DataFrame(all_holidays) # 查看结果示例 print(holidays_df.head())
关键代码解释
getattr(holidays, country_code):这是解决你错误的核心——它能根据字符串country_code的值,动态获取holidays模块对应的属性(即国家节假日类)。比如当country_code为'US'时,就等价于调用holidays.US。- 添加国家标识:在每条数据中加入
Country字段,方便后续区分不同国家的节假日。 - 结构化输出:通过
pd.DataFrame()把零散的字典数据转换成规整的表格,满足你存入DataFrame的需求。
注意事项
如果后续需要添加其他国家,记得先确认holidays库对应的两字母ISO代码(可查阅库的官方文档),避免因代码错误导致找不到对应类。
内容的提问来源于stack exchange,提问作者biviz




