写了个小工具,自动按工作量排期,避开节假日和周末。输入任务的工作量,自动算好开始和结束时间后导出 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))
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于