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

Python Selenium如何校验数组内日期是否在近365/90天范围内

日期区间校验实现方案

核心实现逻辑

要实现每日自动执行的日期区间合规校验,核心是动态计算当日对应的时间阈值,再批量判定爬取到的日期归属区间,需要重点关注三个要点:

  • 时区统一:必须和业务日期使用相同时区,避免跨时区导致的日期偏移,脚本每日自动执行时,时区不一致会直接导致校验结果出错
  • 边界兼容:计算回溯区间时以当日零点作为时间上界,既不会漏算当日数据,也不会把页面错误显示的未来时间误判为合规
  • 异常捕获:页面爬取的日期字符串可能存在格式异常,增加解析错误标记,避免脚本意外中断,也方便排查页面结构变动问题

另外原代码存在一处逻辑问题:data.sort_values(by='Date') 没有接收返回值也没开启inplace修改,实际排序结果不会生效,修正版本已修复该问题。

完整可运行代码

import pandas as pd
from datetime import datetime
from selenium.webdriver.common.by import By

# 注:FrameworkResult为项目内已定义的返回结构类,保持原有引入逻辑即可
def check_date_in_valid_range(self):
    # 1. 抓取页面所有日期元素,过滤空文本
    elements = self.driver.find_elements(By.XPATH, '//span[@class="date-content"]')
    date_text_list = [e.text.strip() for e in elements if e.text.strip()]
    
    # 2. 构建数据表,统一转换日期格式,解析失败的内容标记为空值
    data = pd.DataFrame({'raw_date_text': date_text_list})
    data['parsed_date'] = pd.to_datetime(data['raw_date_text'], errors='coerce')
    
    # 3. 动态计算当日校验阈值(每日执行时自动更新,无需手动修改)
    today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
    threshold_90d = today - pd.Timedelta(days=90)
    threshold_365d = today - pd.Timedelta(days=365)
    
    # 4. 按日期倒序排序
    data = data.sort_values(by='parsed_date', ascending=False).reset_index(drop=True)
    
    # 5. 批量打标校验结果
    data['is_in_last_90d'] = (data['parsed_date'] >= threshold_90d) & (data['parsed_date'] <= today)
    data['is_in_last_365d'] = (data['parsed_date'] >= threshold_365d) & (data['parsed_date'] <= today)
    data['is_parse_failed'] = data['parsed_date'].isna()
    
    # 6. 控制台输出校验统计结果
    print("=== 日期区间校验结果 ===")
    print(f"校验基准日:{today.date()}")
    print(f"近90天合法区间:{threshold_90d.date()} ~ {today.date()}")
    print(f"近365天合法区间:{threshold_365d.date()} ~ {today.date()}")
    print(f"总抓取条目数:{len(data)}")
    print(f"日期格式解析失败条目数:{data['is_parse_failed'].sum()}")
    print(f"近90天合规条目数:{data['is_in_last_90d'].sum()}")
    print(f"近365天合规条目数:{data['is_in_last_365d'].sum()}")
    
    # 输出异常条目明细
    invalid_items = data[(~data['is_in_last_365d']) | (data['is_parse_failed'])]
    if not invalid_items.empty:
        print("异常条目明细:")
        print(invalid_items[['raw_date_text', 'parsed_date', 'is_parse_failed']])
    
    return FrameworkResult(
        status=0,
        data={
            "check_base_date": today,
            "threshold_90d": threshold_90d,
            "threshold_365d": threshold_365d,
            "check_detail": data.to_dict('records'),
            "invalid_item_count": len(invalid_items)
        }
    )

适配调整提示

  • 如果业务使用非本地时区(比如海外站点时区),将datetime.now()替换为对应时区的时间获取逻辑即可,可通过Python标准库zoneinfo或第三方库pytz指定时区,避免跨天场景下的判定错误
  • 如果页面日期存在特殊格式(比如带“昨天”“1周前”这类相对时间文本),需要先做文本转标准日期的预处理,再传入pd.to_datetime做解析
  • 可根据自身业务需要调整校验规则,比如仅校验标注为“近365天”的条目是否真的落在365天区间内,在打标逻辑前增加条目标签的关联判断即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:57:18