数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?

摘要:
而PowerBI的时间智能函数的计算逻辑,是2月29日的上年同期数据为上年2月28日的,换个角度可能更容易理解,就是2月最后一天的数据对比,无论是不是闰年。并且观察2017年2月28日的上年同期数据,与2016年2月28日的数据一样,这很正常。

https://zhuanlan.zhihu.com/p/109964336

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

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

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

数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?第1张

先建立一个基础度量值:

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

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

2月29日-上年同期

建个上年同期的度量值:

收入 PY = CALCULATE( [收入], SAMEPERIODLASTYEAR('日期表'[日期]) )

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

数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?第2张

从上面的数据可以看出,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('日期表'[日期]))

计算结果如下:

数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?第3张

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

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

数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?第4张

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

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

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

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

收入 MTD = TOTALMTD([收入],'日期表'[日期])
收入 MTD PM = CALCULATE( [收入 MTD], DATEADD('日期表'[日期],-1,MONTH))

结果如下:

数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?第5张

在月度环比上,因为每个月都有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函数和规则来写度量值,并不是一定要用时间智能函数。

免责声明:文章转载自《数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】Selenium模拟JQuery滑动解锁RedisTemplate常用集合使用说明-opsForList(三)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

转摘cognos学习笔记

  第一部分 准备知识  概述 (p1)    业务智能(Business Intelligence) 近年来业务智能的话题开始在国内热起来。 业务智能是在计算机应用水平达到一定程度、数据积累到一定量之后提上议事日程的一个应用领域。 业务智能是为更好的决策而对数据进行收集、转换、分析和分发的过程。 业务智能是把数据转化成知识的过程。包括信息的获取、分析和...

无人机飞控三大算法汇总

无人机飞控三大算法:捷联式惯性导航系统、卡尔曼滤波算法、飞行控制PID算法。 一、捷联式惯性导航系统 说到导航,不得不说GPS,他是接受卫星发送的信号计算出自身位置的,但是当GPS设备上方被遮挡后,GPS设备无法定位了。比如在室内、隧道内、地下等场所,基本收不到GPS信号。 语录:任何一款有缺点的产品,必然成就了另一款能克服其缺点的产品。 另一种导航方式是...

java中日期的换算处理

JAVA8中的日期API是JSR-310的实现,并且是工作在ISO-8601日历系统基础上的,但我们也可以在非ISO的日历上。JDK8的日期API大致分为以下几个包: 1 java.time包:JDK8中的基础包,所有常用的基础类都是这个包的一部分,如LocalDate,LocalTime,LocalDateTime等等,所有这些类都是不可变且线程安全的...

基于OpenGL编写一个简易的2D渲染框架-06 编写一个粒子系统

在这篇文章中,我将详细说明如何编写一个简易的粒子系统。 粒子系统可以模拟许多效果,下图便是这次的粒子系统的显示效果。为了方便演示,就弄成了一个动图。 图中,同时显示了 7 种不同粒子效果,看上去效果挺炫酷的。 粒子编辑器 使用粒子编辑器,可以在可视化视图中快速、简便的做出想要的粒子效果。这个粒子系统支持导入 cocos2d 粒子编辑器文件,而且粒子系统的...

算法>并行算法

并行算法 一、并行算法 什么是并行算法? 它可理解为: 适合于在某类并行计算机上求解问题和处理数据的算法, 是一些可同时执行的诸进程的集合, 这些进程相互作用和协调作用, 从而达到对给定问题的求解。 二、并行计算机 并行处理就是把一个传统串行处理的任务分解开来, 并将其分配给多个处理器同时处理, 即在同一时间间隔内增加计算机的操作数量。为并行处理所设计的计算...

Javascript 计算请假天数

转载请注明本文地址:https://www.cnblogs.com/qiaoge0923/p/10219155.html  计算请假天数,笼统来说就是计算两个日期的差值。对于JS来说,两个时间直接相减,得到的是这两个时间差的毫秒数。 先上代码后贴图。 1.测试数据 后文中用到的测试数据如下: var dateStart = '2018-12-01 04...