写了个小工具,自动按工作量排期,避开节假日和周末。输入任务的工作量,自动算好开始和结束时间后导出 csv
效果如下:
| | 工作量 | 计划开始时间 | 计划结束时间 | |----|---------|----------------|----------------| | 0 | 3 | 2025/04/02 | 2025/04/07 | | 1 | 4 | 2025/04/08 | 2025/04/11 | | 2 | 1 | 2025/04/14 | 2025/04/14 | | 3 | 1 | 2025/04/15 | 2025/04/15 |
代码如下:
from datetime import datetime, timedelta import pandas as pd from tabulate import tabulate # 定义 2025 年的节假日 HOLIDAYS_2025 = [ # 元旦 datetime(2025, 1, 1), # 春节 datetime(2025, 1, 28), datetime(2025, 1, 29), datetime(2025, 1, 30), datetime(2025, 1, 31), datetime(2025, 2, 1), datetime(2025, 2, 2), datetime(2025, 2, 3), datetime(2025, 2, 4), # 清明节 datetime(2025, 4, 4), datetime(2025, 4, 5), datetime(2025, 4, 6), # 劳动节 datetime(2025, 5, 1), datetime(2025, 5, 2), datetime(2025, 5, 3), datetime(2025, 5, 4), datetime(2025, 5, 5), # 端午节 datetime(2025, 5, 31), datetime(2025, 6, 1), datetime(2025, 6, 2), # 国庆节 datetime(2025, 10, 1), datetime(2025, 10, 2), datetime(2025, 10, 3), datetime(2025, 10, 4), datetime(2025, 10, 5), datetime(2025, 10, 6), datetime(2025, 10, 7), datetime(2025, 10, 8) ] # 判断是否为工作日(非周末且非假期) def is_working_day(date): return date.weekday() < 5 and date not in HOLIDAYS_2025 # 定义任务调度逻辑 def schedule_tasks(tasks, start_date): schedule = [] current_date = start_date for workload in tasks: # 确保任务的开始时间是工作日 while not is_working_day(current_date): current_date += timedelta(days=1) start = current_date # 分配工作量 days_needed = workload while days_needed > 0: if is_working_day(current_date): days_needed -= 1 if days_needed > 0: # 确保任务未完成时才推进日期 current_date += timedelta(days=1) # 确定结束时间 end = current_date while not is_working_day(end): # 校正为工作日 end += timedelta(days=1) # 保存当前任务的计划 schedule.append({ "工作量": workload, "计划开始时间": start.strftime("%Y/%m/%d"), "计划结束时间": end.strftime("%Y/%m/%d") }) # 确保下一任务的开始时间从有效的工作日开始 current_date = end + timedelta(days=1) while not is_working_day(current_date): current_date += timedelta(days=1) return schedule # 示例任务和起始日期 tasks = [3, 4, 1, 1] # tasks = [2, 2, 2, 2, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 3, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, # 3, 2, 2, 2, 2, 4, 4, 2, 4, 2, 8, 6, 2, 4, 3, 2, 3] # tasks = [2, 2, 1, 3, 2, 2, 4, 8, 4, 2, 8, 2, 2, 8, 2] start_date = datetime.strptime("2025-04-02", "%Y-%m-%d") schedule = schedule_tasks(tasks, start_date) schedule_df = pd.DataFrame(schedule) schedule_df.to_csv('schedule.csv', index=False, encoding='utf-8-sig') # print(schedule_df) # 打印调度结果为 Markdown 格式 print(tabulate(schedule, headers="keys", tablefmt="github", showindex=True))
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于