Pandas isin结合holidays.country_holidays首次调用全返回False的问题求助
问题原因
holidays.country_holidays()返回的是惰性加载对象,首次调用isin()时,该对象还未实际生成节假日日期数据,导致全部匹配失败;而用in逐个判断或第二次调用isin()时,会触发对象内部的数据加载逻辑,因此能得到正确结果。
可靠高效的解决方案
直接将节假日对象转换为日期集合(集合的查找效率远高于惰性对象),提前加载所有节假日数据,就能避免上述异常:
import pandas as pd import holidays X = pd.DataFrame({'timestampUtc': pd.date_range("2000-12-25", "2001-01-06", freq="1440min", tz="utc")}) X['local_date'] = X['timestampUtc'].dt.tz_convert(tz='Europe/Berlin').dt.date x_daily = X[['local_date']].drop_duplicates() # 转换为日期集合,一次性加载所有节假日数据 de_holidays = set(holidays.country_holidays(country='DE', state='BW')) # 直接添加标识节假日的布尔列,一次调用即可得到正确结果 x_daily['is_holiday'] = x_daily['local_date'].isin(de_holidays)
额外优化方案
如果需要同时获取节假日名称,可以将节假日对象转为字典,通过map实现匹配:
de_holidays_dict = dict(holidays.country_holidays(country='DE', state='BW')) # 添加布尔列 x_daily['is_holiday'] = x_daily['local_date'].isin(de_holidays_dict.keys()) # 添加节假日名称列,非节假日填充指定内容 x_daily['holiday_name'] = x_daily['local_date'].map(de_holidays_dict).fillna('非节假日')
内容的提问来源于stack exchange,提问作者skeletor
相关产品推荐
相关产品推荐

