如何新建Calculated Table实现任务时长按小时拆分统计
任务时长按小时拆分解决方案
场景1:Power BI DAX 计算表实现
假设你的原始数据表名称为任务数据表,直接新建计算表,粘贴以下DAX代码即可:
拆分后的任务时长表 = GENERATE ( '任务数据表', VAR 开始小时 = HOUR ( '任务数据表'[Start Time] ) VAR 开始分钟 = MINUTE ( '任务数据表'[Start Time] ) VAR 结束小时 = HOUR ( '任务数据表'[End Time] ) VAR 结束分钟 = MINUTE ( '任务数据表'[End Time] ) VAR 覆盖小时序列 = GENERATESERIES ( 开始小时, 结束小时, 1 ) RETURN SELECTCOLUMNS ( 覆盖小时序列, "Hour", [Value], "Mins in Hour", SWITCH ( TRUE(), [Value] = 开始小时 && [Value] = 结束小时, 结束分钟 - 开始分钟, [Value] = 开始小时, 60 - 开始分钟, [Value] = 结束小时, 结束分钟, 60 ) ) )
逻辑说明:
- 遍历原始表每一行任务,提取当前任务的开始/结束小时、开始/结束分钟
- 生成该任务覆盖的所有小时的连续序列
- 按规则计算每个小时内的任务占用分钟数:
- 任务开始、结束在同一小时:结束分钟减去开始分钟
- 任务首个小时:60减去开始分钟
- 任务最后一个小时:直接取结束分钟
- 中间整小时:固定为60
该代码运行后输出结果和你给出的期望示例完全一致。
场景2:Python Pandas 实现
如果是用Python处理数据,可使用以下代码实现拆分:
import pandas as pd # 此处替换为你自己的原始数据读取逻辑,示例假设df为原始数据表 # df = pd.read_excel("你的原始数据文件路径.xlsx") def split_task_by_hour(row): start_h, start_m = map(int, row["Start Time"].split(":")) end_h, end_m = map(int, row["End Time"].split(":")) res = [] for hour in range(start_h, end_h + 1): if hour == start_h and hour == end_h: mins = end_m - start_m elif hour == start_h: mins = 60 - start_m elif hour == end_h: mins = end_m else: mins = 60 res.append({ "Task": row["Task"], "Hour": hour, "Mins in Hour": mins, "Start Day": row["Start Day"] }) return res # 生成最终结果表 splitted_data = [] for _, row in df.iterrows(): splitted_data.extend(split_task_by_hour(row)) result_df = pd.DataFrame(splitted_data)
内容的提问来源于stack exchange,提问作者Chasuk19
相关产品推荐
相关产品推荐

