

新闻资讯
技术教程本文介绍如何使用 pandas 对原始任务数据进行工时拆分:基于最早开始日期,将每项任务的总工时按工作日(周一至周五)均匀分配,每日最多7小时,自动跳过周末并处理跨日连续占用场景。
在项目排期或资源调度中,常需将总工时(如开发人天)合理分配到具体工作日,同时满足两项硬性约束:单日工时上限(如7小时) 和 仅限工作日(排除周六、周日)。本教程提供一种高效、可扩展的 pandas 实现方案,无需循环遍历,完全向量化处理。
import pandas as pd import numpy as np # 构建初始数据 df= pd.DataFrame({ 'ID': [1, 2, 3], 'EarliestStart': ['28.09.2025', '29.09.2025', '15.11.2025'], 'Hours': [15.00, 5.00, 23.00] }) df['EarliestStart'] = pd.to_datetime(df['EarliestStart'], format='%d.%m.%Y') # 步骤1:按需重复行(向上取整:ceil(Hours/7)) out = df.loc[df.index.repeat(np.ceil(df['Hours'].div(7)))] # 步骤2:为每组生成递增的工作日日期 n = out.groupby(level=0).cumcount() out['PlannedStart'] = out['EarliestStart'] + n * pd.offsets.BusinessDay() # 步骤3:提取星期名称(中文环境可加 .dt.day_name(locale='zh_CN')) out['Weekday'] = out['PlannedStart'].dt.day_name() # 步骤4:计算每日工时(前N-1日为7小时,最后1日为余数,余数为0则仍为7) remainder = out.pop('Hours') % 7 out['HoursSplitted'] = np.where( out.index.duplicated(keep='last') | remainder.eq(0), 7.0, remainder ) # 可选:格式化日期为 DD.MM.YYYY 并转为字符串(匹配示例输出) out['PlannedStart'] = out['PlannedStart'].dt.strftime('%d.%m.%Y') out['EarliestStart'] = out['EarliestStart'].dt.strftime('%d.%m.%Y') out = out.reset_index(drop=True)[['ID', 'EarliestStart', 'PlannedStart', 'Weekday', 'HoursSplitted']]
该方法简洁、健壮且性能优异,适用于数千行以内的常规排期场景,是 pandas 时间序列资源分配问题的典型范式解法。