PowerQuery如何将起止日期变成连续日期序列?

您看看需不需要 2024-09-20 19:38:53

遇到过星友多次提到过这样的需求,只有两列日期的区间,开始日期和结束日期,如何利用这两个日期来生成这个区间的全部日期列表呢?

以下面的数据为例,每个产品的价格有效日期是个区间,有起止两个日期的字段。

需求是生成一个序列,将每个价格对应的所有日期全部列出来,其实在PowerQuery中,有多个M函数都可以实现这种需求。

1. List.Dates

添加自定义列:

List.Dates(

[开始日期],

Duration.Days([结束日期]-[开始日期])+1,

#duration(1, 0, 0, 0)

)

List.Dates生成一个日期列表,第一个参数是开始日期,第二个参数是日期列表的计数,第三个参数日期之间的间隔,#duration () 4 个参数来控制生成序列的间隔数据和粒度:天、小时、分钟和秒。

上面的公式生成一列list,点击某个单元格的list,就可以在界面左下方看到该list的内容,就是本行的开始日期到结束日期的所有日期列表。

然后点击这一列标题右侧的展开按钮,就得到了一列日期,其他行重复显示:

2. List.Transform函数

List.Transform(

{Number.From([开始日期])..Number.From([结束日期])},

Date.From

)

这个公式的逻辑是,Number.From将日期转换为数字,利用两个点自动生成连续的数字序列,再利用List.Transform将数字列表转换为日期列表。

展开的方式与上面一样,不再重复介绍。

3. List.Generate

let

a=[开始日期],

b=[结束日期]

in

List.Generate(

() => a,

each _ <= b,

each Date.AddDays( _ , 1 )

)

List.Generate是个非常强大的函数,对于创建有规律的列表非常有效,这里通过这个例子来简单解释一下这个函数的基本用法:

第一个参数显示初始值,即开始日期。第二个参数是执行条件,只要执行第三个参数后生成的结果满足小于等于结束日期,就继续执行。第三个参数提供要执行的功能,将生成的每个步骤增加 1 天。

以上就是创建日期序列的3种方法,以后再遇到这种情况可以直接套用,如果能在这个案例基础上理解这几个函数的用法,举一反三,将能轻松解决各种类似的场景需求~

powerbi星球

0 阅读:0

您看看需不需要

简介:感谢大家的关注