课表合并去重 Skill
将多人提交的各格式课表合并为统一总表,自动去重,检测冲突时段,计算所有人共同空闲时间并按合适度排序。
功能
- 格式解析:自动识别中文/英文/节次/数字等多种时间格式,统一标准化
- 去重合并:按姓名+学号去重,交叉合并为完整总表
- 冲突检测:任意参与者在某时段有事即标记为冲突,红底高亮
- 空闲计算:基于30分钟网格计算所有人共同空闲时段
- 智能排序:综合考虑时段权重、时长匹配度、活动性质日期系数
- 三表输出:干净总表(Sheet1) + 冲突明细(Sheet2) + 修改日志(Sheet3)
使用方式
对话中使用
直接告诉 WorkBuddy 你的需求,例如:
> "帮我合并这些课表,活动需要90分钟,工作性质"
然后提供课表数据(粘贴文本 或 上传 Excel/CSV 文件)。
数据格式示例:
张三 2024001 周一3-4节 高等数学
李四 2024002 周二下午1-3点 英语
王五 2024003 Mon 10:00-11:45 物理
赵六 2024004 7月20日 14:00-16:30 化学 ← 日期自动转星期
钱七 2024005 7月20日-7月24日 10:00-11:45 实验 ← 日期范围自动展开为5条
CLI 使用
python scripts/merge_schedules.py -d 90 -t work -o output.xlsx "schedule_data.xlsx"
# 或传入文本
python scripts/merge_schedules.py -d 120 -t entertainment -o output.xlsx "TEXT:张三 2024001 周一3-4节 数学"
参数说明
| 参数 | 说明 | 可选值 |
|---|---|---|
-d / --duration |
活动所需时长(分钟) | 整数 |
-t / --type |
活动性质 | work / entertainment / neutral |
-o / --output |
输出Excel路径 | 默认 schedule_merged.xlsx |
支持的时间格式
- 节次格式:
周一3-4节、第5-6节 - 中文格式:
周二下午1-3点、周三上午10点半-12点 - 英文格式:
Mon 10:00-11:45、Friday 14:00-16:30 - 纯数字格式:
10:00-11:45 - 日期格式(自动转星期):
7月20日 10:00-11:45、2026-07-20 14:00-16:30 - 日期范围(自动展开):
7月20日-7月24日 10:00-11:45(展开为周一~周五各一条)
排序规则
最终得分 = 时段权重(滑窗最优) × 时长匹配度 × 日期性质系数
时段权重(滑窗最优)
空闲块内部按 30 分钟格子划分,每个格子有独立权重。不取整块平均,而是在空闲块内滑窗寻找最优的连续 N 格子窗口(N = 活动时长 / 30min 向上取整),取该窗口的平均权重:
| 时间段 | 权重 | 含义 |
|---|---|---|
| 9:00-11:45 / 13:45-17:30 | 1.0 | 黄金时段 |
| 8:00-9:00 / 18:30-20:00 | 0.6 | 边缘时段 |
| 17:30-18:00 | 0.5 | 傍晚过渡 |
| 18:00-18:30 / 20:00-22:15 | 0.4 | 低效时段 |
| 11:45-13:45 | 0.3 | 午休 |
示例:空闲块 18:00-22:00 跨 4 个权重区,120 分钟活动的最优子窗口为 18:00-20:00(权重 0.55),而非整块平均 0.475。
时长匹配度
| 冗余时间 | 系数 |
|---|---|
| < 0 | 0(不可用) |
| 0~15 分钟 | 0.70→0.95 线性 |
| ≥ 15 分钟 | 1.0(满分平台) |
日期系数
| 类型 | 工作日 | 周末 |
|---|---|---|
| work | 1.05 | 0.95 |
| entertainment | 0.95 | 1.05 |
| neutral | 1.0 | 1.0 |
依赖
- Python 3.9+
- openpyxl