待办期限×日程表核对:「下周三」算错一周、deadline 撞上请假日的两个真坑

2026-10-07 · 喵窝资源铺

上一篇《会议纪要自动提取待办》把纪要里的 action items 提成了带期限的待办表。但提取出来的期限长这样:周五、下周三、月底——全是相对日期,没法直接跟日程表核对。这篇把链条走完最后一公里:相对期限锚定成绝对日期 → 对每个人的日程表查冲突(deadline 当天请假、当天被会排满),输出一张核对表。

输入:两份数据

待办表(上一篇脚本的 CSV 输出,会议日期 2026-10-07,周三):

状态,负责人,待办事项,期限
已完成,李娜,完成竞品调研报告,未定期限
进行中,张伟,输出新用户引导流程初稿,10月10日
进行中,李娜,补齐竞品价格对比表,周五
进行中,王强,压测订单接口,下周三
进行中,赵敏,整理客服常见问题 30 条,月底
进行中,张伟,和老刘对齐 API 字段口径,明天

日程表(日期,人员,时段,事项,内容故意埋了:期限当天年假、期限当天 3 个会、期限当天晚上的年会):

2026-10-09,李娜,09:30-11:30,季度复盘会
2026-10-09,李娜,14:00-16:00,供应商比稿
2026-10-10,张伟,10:00-12:00,引导流程评审会
2026-10-08,张伟,全天,年假
2026-10-14,王强,09:00-11:00,压测方案评审
2026-10-14,王强,13:00-15:00,架构委员会
2026-10-14,王强,16:00-18:00,跨部门排期会
2026-10-31,赵敏,19:00-21:00,公司年会

核心代码(60 行)

from datetime import date, timedelta
WEEK = {'一':0,'二':1,'三':2,'四':3,'五':4,'六':5,'日':6,'天':6}

def anchor(due, meeting_day):
    """把「明天/周五/下周三/月底/X月X日」锚定到绝对日期"""
    m = re.match(r'(\d{1,2})月(\d{1,2})日', due)
    if m:
        return date(meeting_day.year, int(m.group(1)), int(m.group(2)))
    if due == '明天':  return meeting_day + timedelta(days=1)
    if due == '后天':  return meeting_day + timedelta(days=2)
    if due == '月底':
        nxt = date(meeting_day.year + (meeting_day.month == 12),
                   meeting_day.month % 12 + 1, 1)
        return nxt - timedelta(days=1)
    m = re.match(r'(下|本|这)?周([一二三四五六日天])', due)
    if m:
        pre, i = m.group(1), WEEK[m.group(2)]
        if pre == '下':
            # 下一个自然周的周X:必须按周一对齐,不能 offset+7(见坑1)
            days = (7 - meeting_day.weekday()) + i
        else:
            days = (i - meeting_day.weekday()) % 7
            if days == 0 and pre is None:
                days = 7  # 光说「周三」而当天就是周三 → 按下一周
        return meeting_day + timedelta(days=days)
    return None

def check(todo_csv, sched_csv, meeting_day):
    problems, ok = [], []
    for t in csv.DictReader(open(todo_csv, encoding='utf-8-sig')):
        if t['状态'] == '已完成': continue
        d = anchor(t['期限'], meeting_day)
        if d is None:
            problems.append(f'??未识别|{t["负责人"]}|期限「{t["期限"]}」解析不了,交人工')
            continue
        if d < meeting_day:
            problems.append(f'!!超期|{t["负责人"]}|期限 {d} 早于会议日期,纪要可能笔误')
            continue
        day_s = [s for s in sched if s[0]==d.isoformat() and s[1]==t['负责人']]
        if any('假' in s[3] for s in day_s):
            problems.append(f'!!冲突|{t["负责人"]}|{t["待办事项"]}|期限 {d} 当天请假')
        elif day_s:
            problems.append(f'!!紧张|{t["负责人"]}|{t["待办事项"]}|期限 {d} 当天已有 '
                            f'{len(day_s)} 个会({";".join(s[2]+" "+s[3] for s in day_s)})')
        else:
            ok.append(f'ok|{t["负责人"]}|期限 {d} 当天空闲')
    return problems, ok

实跑结果(数据说话)

会议日期 2026-10-07,核对 5 条进行中待办:

!!紧张|张伟|输出新用户引导流程初稿|期限 2026-10-10 当天已有 1 个会(评审会)
!!紧张|李娜|补齐竞品价格对比表|期限 2026-10-09 当天已有 2 个会(复盘会;比稿)
!!紧张|王强|压测订单接口|期限 2026-10-14 当天已有 3 个会(评审;架构委;排期会)
!!紧张|赵敏|整理客服常见问题 30 条|期限 2026-10-31 当天已有 1 个会(19:00-21:00 年会)
!!冲突|张伟|和老刘对齐 API 字段口径|期限 2026-10-08 当天请假(全天 年假)

5 条待办 4 条撞日程:deadline 写「明天」的人当天在休年假;写「下周三」的人那天排了整整 3 个会;写「月底」的人月底那晚是公司年会。这种表人工根本看不出来,只有把相对日期换算成绝对日期、再跟日程表一一对,才现形。

实跑揪出的两个真坑

可复现

脚本和数据都在文内,把待办 CSV(上一篇脚本的输出)和日程表 CSV 喂进去即可:python deadline_conflict.py todos.csv sched.csv 2026-10-07 out.csv。连跑两次输出逐字一致(幂等);期限解析不了的行标 ??未识别 交人工,不硬猜。

如果你的纪要格式更野(期限藏在备注里、多人共担一条)、或者日程表在飞书/日历导出件里,逻辑要再包一层,可以直接找我们代写(见下)。

懒得自己跑?找我们代写
喵窝资源铺提供 Python 脚本代写服务:你说清楚纪要格式、日程表来源和要什么核对表,我们写好、用你的真实数据测试通过再交付,24 小时内出活。AI 服务,明码标价,先看效果再付款(虚拟物品不退款,不满意免费重做)。
👉 了解代写服务 | 联系我们

📖 相邻文章:会议纪要提取待办 · 值班表冲突检查 · 考勤异常汇总 · 聊天记录批量提取待办 · 接龙按选项统计票数 · 博客目录

核对表仅供参考;!!冲突行请先跟当事人确认再改期,别拿着脚本输出直接改别人日程。