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

Python for循环内if判断datetime.date相等不生效 无法过滤非交易日

问题根因

过滤逻辑失效核心错误

你在date_maker中比对休市日期的逻辑完全错误:遍历self.nobiz时,每一次循环都会覆盖adding的取值,最终adding的结果仅和休市列表最后一个元素的匹配结果挂钩,前面所有匹配结果都会被覆盖。
比如你休市列表有100个日期,哪怕当前待判断日期是第1个休市日,只要最后一个元素和它不相等,adding最终还是会被设为True,导致休市日期被误加入结果。

休市日期生成逻辑错误

nonbizday方法的生成逻辑不符合A股2021年休市规则:

  • 固定每次加1天、加6天的逻辑既不能正确覆盖全年周末,也没有包含元旦、春节等法定休假日
  • 循环终止条件判断滞后,会把2022年的日期也追加到休市列表中
  • 方法内定义的newyears变量从未被使用,属于冗余代码
修复方案

修正过滤逻辑

把date_maker中的日期比对部分改成如下逻辑:

def date_maker(self):
    btime = self.data['Meta Data']['3. Last Refreshed']
    btime = datetime.datetime.strptime(btime, dtnotime).date()
    benchlist = []
    # 先把休市列表转成集合,查询效率比列表高100倍以上
    holiday_set = set(self.nobiz)

    for i in range(1, 11):
        current_date = btime - datetime.timedelta(days=i)
        # 只要不在休市集合里就加入结果,不需要手写循环遍历比对
        if current_date not in holiday_set:
            benchlist.append(current_date)
    return benchlist

修正休市日期生成逻辑

如果要准确生成2021年A股休市日期,建议直接录入官方公布的法定休假日,再叠加全年周末,示例逻辑:

def nonbizday(self):
    # 2021年A股法定休假日,可按证监会官方公告补充完整
    statutory_holidays = [
        datetime.date(2021,1,1), datetime.date(2021,2,11),
        # 剩余法定休假日按规则补全
    ]
    nobiz = set(statutory_holidays)
    # 遍历2021年所有日期,把周末加进休市列表
    d = datetime.date(2021,1,1)
    while d.year == 2021:
        # weekday返回值5对应周六、6对应周日
        if d.weekday() >=5:
            nobiz.add(d)
        d += datetime.timedelta(days=1)
    return list(nobiz)
其他优化建议
  • 日常开发直接用成熟工具库实现交易日过滤即可,不需要手写逻辑:比如用pandas.date_range的freq='B'参数生成基础工作日,对接exchange_calendars库可直接获取A股、港股等全球市场的准确交易日序列,自动适配所有休市规则
  • 变量命名尽量见名知意,比如nobiz改成cn_stock_holidays_2021,benchie改成trading_date_candidate,避免后续维护看不懂含义
  • 调试用的print代码上线前清理,或者替换为logging模块输出可分级的日志

内容的提问来源于stack exchange,提问作者KingAndrew801

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:06:02