Power Query中无需IFELSE实现含非整数天数时长的数据集扩展方法咨询
Power Query中无需IFELSE实现含非整数天数时长的数据集扩展方法咨询
嘿,刚好可以用Power Query的列表和数值处理功能来搞定这个需求,完全不用写IFELSE语句,我给你一步步拆解下~
首先先确认下你的原始数据结构大概是这样的(方便对应步骤):
| Name | start | Start end period | end | Leave End period | Duration |
|---|---|---|---|---|---|
| a | 05-11-2023 | pm | 06-11-2023 | pm | 1.5 |
具体操作步骤:
统一日期格式
先把start和end列转换成Power Query能识别的日期类型:选中这两列,切换到「转换」选项卡,选择「数据类型」→「日期」。如果你的日期是DD-MM-YYYY格式,怕识别出错的话,可以用自定义转换,公式如下(替换原列或者新建列都可以):Date.FromText([start], [Format="dd-MM-yyyy"])生成待扩展的日期列表
新建一个自定义列,用数值拆分和列表函数来生成需要拆分行的日期,核心逻辑是把时长拆成整数部分和小数部分,分别处理:let // 提取时长的整数天数部分 intDays = Number.IntegerPart([Duration]), // 提取时长的小数天数部分 fracDays = Number.FractionalPart([Duration]), // 生成整数天数对应的连续日期列表 fullDays = if intDays > 0 then List.Dates([start], intDays, #duration(1,0,0,0)) else {}, // 如果存在小数时长,就把结束日期加入列表 partialDay = if fracDays > 0 then {[end]} else {} in // 合并两个列表得到最终的日期集合 List.Combine({fullDays, partialDay})这里完全没用到IFELSE语句,用的是Power Query内置的数值处理和列表生成函数,逻辑清晰还灵活~
展开日期列表到新行
点击自定义列右侧的展开按钮,选择「展开到新行」,这样列表里的每个日期就会变成单独的一行。整理最终结果
把生成的日期列重命名为Date,调整列的顺序,就得到你想要的效果啦:
| Name | start | Start end period | end | Leave End period | Duration | Date |
|---|---|---|---|---|---|---|
| a | 05-11-2023 | pm | 06-11-2023 | pm | 1.5 | 05-11-2023 |
| a | 05-11-2023 | pm | 06-11-2023 | pm | 1.5 | 06-11-2023 |
额外说明
不管你的小数时长是0.5、0.3还是其他大于0的数值,这个方法都适用——只要小数部分存在,就会把结束日期作为单独一行保留,对应那部分时长。整个过程完全依赖Power Query的原生函数,避开了IFELSE的复杂逻辑,维护起来也更方便~
备注:内容来源于stack exchange,提问作者doraemon
相关产品推荐
相关产品推荐

