PowerBI专栏数据分析商业智能BI那点事儿

闰年2月29日,PowerBI时间智能函数是如何处理的?

2020-02-29  本文已影响0人  PowerBI星球

​今年是闰年,马上就到2月29日了,有星友问我,在Power BI中,2月29日的上年同期是怎么计算的?

这是个好问题,正好梳理一下,PowerBI时间智能函数是如何处理不规则日期的对比数据的。

以一个模拟的订单表数据为例,订单日期涵盖了2015年、2016年和2017年,其中2016年是闰年,添加一个相匹配的日期表与之建立关系,

先建立一个基础度量值:

收入 = SUM('订单表'[销售额])

然后通过下面几个示例,来看看几个和2月29日相关的各种数据,是怎么计算的?以及时间智能函数处理闰年的计算逻辑。

2月29日-上年同期

建个上年同期的度量值:

收入 PY = 

CALCULATE(

    [收入],

    SAMEPERIODLASTYEAR('日期表'[日期])

)

把这个度量值放入到矩阵中看看结果:

从上面的数据可以看出,2016年2月29日和28日的上年同期数据都是48000,与2015年2月28日的数据是一样的。

2016年2月28日的上年同期数据是2015年2月28日很正常,那么为什么2016年2月29日的上年同期数据也是2015年2月28日呢?

对于不规则的日期,根据特定的要求和逻辑,可以设计不同的对比方式。比如2015年是没有2月29日的,那么2016年2月29日的上年同期可以设计为空值。

而PowerBI的时间智能函数的计算逻辑,是2月29日的上年同期数据为上年2月28日的,换个角度可能更容易理解,就是2月最后一天的数据对比,无论是不是闰年。

并且观察2017年2月28日的上年同期数据,与2016年2月28日的数据一样,这很正常。

只是在2017年,找不到这样的日期:它的上年同期数据,可以与2016年2月29日对应。

2月29日-本年累计的上年同期

本年累计以及本年累计的上年同期度量值可以这样写:

收入 YTD = TOTALYTD([收入],'日期表'[日期])

收入 YTD PY =

CALCULATE(

    [收入 YTD],

    SAMEPERIODLASTYEAR('日期表'[日期])

)

计算结果如下:

本年累计的同期对比结果,与上面当日数据的同期对比逻辑是一样的,依然是2016年2月29日的上年同期,是2015年2月28日的数据。

从上图可以看到2017年2月28日上年同期的本年累计是4087000,但是如果看2017年2月份的上年同期本年累计,却是4129000,

也就是说在本年累计的上年同期的计算中,2017年2月28日的数据和2017年2月份的数据是不一致的。

但在月份这个粒度上,2017年2月的上年同期,与2016年2月的数据完全一致,并没有问题。

2月29日-本月累计的上月

需要建本月累计和上月累计的度量值,可以这样写:

收入 MTD = TOTALMTD([收入],'日期表'[日期])

收入 MTD PM =

CALCULATE(

    [收入 MTD],

    DATEADD('日期表'[日期],-1,MONTH)

)

结果如下:

在月度环比上,因为每个月都有29号,29号本身的数据没有问题,但在3月30号和3月31号的上月同期计算中,因为2月没有对应的日期,所以都等于2月29日的数据。

关于月度环比,这个很正常,因为即使不是闰年,3月30日和3月31日的上月同期数据,也是都等于2月28日的数据。

在日期维度月度环比的计算上,不只是闰年有2月29日才存在这个问题,其实每年都存在,因为有的月份是31天,有的月份是30天,比如7月31号的上月同期数据就是6月30日的数据。

总结

通过上面几个示例,对时间智能函数的计算逻辑总结如下:

日期粒度上的计算,如果没有对应的日期,会自动等于上期最后一天的数据;

月份粒度上的计算,是否为闰年,没有任何影响;

在本期累计的上期计算中,可能会出现,当月最后一天的累计数与当月的累计数不一致的情况。

以上就是时间智能函数的计算逻辑,其实没有必要担心2月29日的计算问题,就像不用担心某个月是否有31号一样。

如果你的业务中,需要的计算逻辑不是时间智能函数的逻辑,应根据需求调整,按通用的DAX函数和规则来写度量值,并不是一定要用时间智能函数。

关于时间智能函数的学习和运用,你还可以参考这两篇文章:

33个时间智能函数 

各种时间指标的度量值,让你一次看个够

如果你刚开始学习Power BI,可在微信公众号后台回复"PowerBI",获取《七天入门PowerBI》电子书,轻松上手。

采悟 @ PowerBI星球

上一篇 下一篇

猜你喜欢

热点阅读