You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:02:23