如何在Python脚本中自动排除银行假日以获取正确前置数据?
自动排除银行假日,让Python脚本找到正确的前置数据文件夹
我来给你几个实用的方案,帮你不用手动改日期就能让脚本自动定位到前一个工作日的output.csv:
方案1:手动维护节假日列表(无需额外依赖)
如果你的银行假日数量不多、每年变化不大,直接手动定义节假日集合是最直接的方式,不用安装任何第三方库:
import datetime # 把你的银行假日都加到这个集合里,格式为 datetime.date(年, 月, 日) BANK_HOLIDAYS = { datetime.date(2019, 12, 25), datetime.date(2019, 12, 26), # 后续新增节假日直接在这里添加即可 } def get_previous_workday(current_date=None): # 默认用今天的日期,也可以传入指定日期测试 if current_date is None: current_date = datetime.date.today() # 先往前推一天 previous_day = current_date - datetime.timedelta(days=1) # 循环检查:如果是周末(周六/周日)或者在银行假日列表里,就继续往前推 while previous_day.weekday() >= 5 or previous_day in BANK_HOLIDAYS: previous_day -= datetime.timedelta(days=1) # 格式化成你需要的文件夹命名格式:DDMMYYYY return previous_day.strftime("%d%m%Y") # 调用函数获取目标文件夹名,然后拼接路径 target_folder = get_previous_workday() output_file = f"data/{target_folder}/output.csv"
为什么这么写?
- 用集合存储节假日是因为集合的查询效率极高(O(1)),比列表快很多
weekday()方法返回0=周一,4=周五,5=周六,6=周日,所以>=5就是周末- 循环会一直往前找,直到找到第一个既不是周末也不是节假日的日期
方案2:用第三方库自动获取法定节假日(省心省力)
如果你的银行假日和当地法定假日完全一致,推荐用holidays库,它支持全球很多国家/地区的法定假日,不用手动维护列表:
步骤1:安装库
pip install holidays
步骤2:编写代码
import datetime import holidays # 选择对应的国家/地区代码,比如英国是'GB',中国是'CN',根据你的实际情况调整 LOCAL_HOLIDAYS = holidays.UnitedKingdom() def get_previous_workday(current_date=None): if current_date is None: current_date = datetime.date.today() previous_day = current_date - datetime.timedelta(days=1) # 同样检查是否是周末或法定假日 while previous_day.weekday() >= 5 or previous_day in LOCAL_HOLIDAYS: previous_day -= datetime.timedelta(days=1) return previous_day.strftime("%d%m%Y") # 使用示例 target_folder = get_previous_workday() output_file = f"data/{target_folder}/output.csv"
优势
- 自动更新节假日:每年的法定假日更新时,只需要升级
holidays库即可,不用手动改代码 - 支持多种地区:除了国家,还支持部分地区的本地假日(比如苏格兰的额外假日)
方案3:用Pandas快速实现(如果你已经在用Pandas)
如果你的脚本已经依赖Pandas,那么可以用它的bdate_range方法直接生成工作日,还能自定义排除节假日:
import pandas as pd import datetime def get_previous_workday(current_date=None): if current_date is None: current_date = datetime.date.today() # 生成从当前日期往前的2个工作日,取第一个就是前一个工作日 # 如果需要排除自定义假日,加上holidays参数即可 custom_holidays = [datetime.date(2019, 12, 25), datetime.date(2019, 12, 26)] previous_workday = pd.bdate_range(end=current_date, periods=2, holidays=custom_holidays)[0] return previous_workday.strftime("%d%m%Y") # 使用示例 target_folder = get_previous_workday() output_file = f"data/{target_folder}/output.csv"
说明
bdate_range默认排除周末,加上holidays参数就能排除自定义的银行假日- 适合已经在做数据处理的脚本,不用额外引入新库
你可以根据自己的需求选择最合适的方案,个人推荐如果符合法定假日的话用方案2,省心又不用手动维护~
内容的提问来源于stack exchange,提问作者Alex Huong Tran
相关产品推荐
相关产品推荐

