Power BI动态日期轴方法总结

本文总结了Power BI中实现动态日期轴的方法,包括使用计算表、计算组和字段参数。通过这些技术,可以实现根据用户选择切换年度、季度、月度趋势。文章详细介绍了每种方法的实现步骤,并提到了一些潜在的排序问题及解决方案。

趋势,应该是我们做可视化时最熟悉的一个词了,看趋势自然离不开日期,年度趋势,月趋势,周趋势等等。Power BI中我们可以借助于计算表,计算组,字段参数来实现动态实时轴的效果。

计算表实现动态日期切换

这个方法在字段参数出来后是有些过时的,基本可以淘汰掉了,但是实现的思路还是可以借鉴的,这也涉及到了另一个主题,学习的本质,技术是一个在更新迭代的,但是一些思想是不变的。掌握了底层逻辑就能以不变应万变。

废话不多说,来回顾下具体怎么实现。

  • • 要实现动态切换日期轴,就要日期表中有一个类别,来标注当前的日期区间类别,是年,还是季度或者是月

  • • 不同的区间类型还应有一不同的区间名称,比如年区间类型时,该列应全是年份名称,为季度时,应是年季组合字段

就如下面这样,实际使用时还应加入相应的排序字段




区间区间类型日期2023年2023-04-242023年2023-04-252023Q2季2023-04-242023Q2季2023-04-25

转换为计算表如下,代码有些长,其实类似的代码重复写了几遍而已

DatesPeriod = 
VAR DT = 'Dates'
VAR YearLevel =
    ADDCOLUMNS (
        SELECTCOLUMNS ( DT, "区间", "Y" & FORMAT ( [Year], "0" ), "日期", [Date] ),
        "区间类型", "年",
        "区间类型OrderBy", 1,
        "区间OrderBy", YEAR ( [日期] )
    )
VAR QuarterLevel =
    ADDCOLUMNS (
        SELECTCOLUMNS (
            DT,
            "区间",
                "Y" & FORMAT ( [Year], "0" ) & "Q"
                    & FORMAT ( [Quarter], "0" ),
            "日期", [Date]
        ),
        "区间类型", "季",
        "区间类型OrderBy", 2,
        "区间OrderBy", FORMAT ( [日期], "YYYY\QQ" )
    )
VAR MonthLevel =
    ADDCOLUMNS (
        SELECTCOLUMNS (
            DT,
            "区间",
                "Y" & FORMAT ( [Year], "0" ) & "M"
                    & FORMAT ( [Month], "0" ),
            "日期", [Date]
        ),
        "区间类型", "月",
        "区间类型OrderBy", 3,
        "区间OrderBy", FORMAT ( [日期], "YYYY\Mmm" )
    )

VAR DateLevel =
    ADDCOLUMNS (
        SELECTCOLUMNS ( DT, "区间", FORMAT ( [Date], "yyyy/M/dd" ), "日期", [Date] ),
        "区间类型", "日",
        "区间类型OrderBy", 4,
        "区间OrderBy", [日期]
    )
RETURN
    UNION ( YearLevel, QuarterLevel, MonthLevel,  DateLevel )

建立关系

f2420aff7e4ba6fd1d7a6123cde938b2.jpeg

效果如下

0f9ab465c7daf81a19d6eccb16772eb5.jpeg

计算组实现动态日期切换

现在需求又变了,不需要按年季月这样来切换日期轴,而是根据参数的选择来切换,比如最近3个月,最近6个月,12个月的趋势。在计算组刚出来没多久sqlbi就给出了解决方案:

Show previous 6 months of data from single slicer selection - SQLBI --- 显示来自单个切片器选择的前 6 个月的数据 - SQLBI[1]

  • • 新建参数,用于选择最近的日期

Period = GENERATESERIES(3, 36, 1)
  • • 需要复制一张日期表,和现有的日期表是虚拟关系

430f2173a7c3c6d5591bd94af8095ad0.jpeg
  • • 打开Tabular Editor新建计算组,这里只是修改了月份数为参数的值

VAR NumOfMonths = -[Months Value]
VAR ReferenceDate = MAX ( 'Dates'[Date] )
VAR Previous = DATESINPERIOD ( 'DatesPeriod2'[Date], ReferenceDate, NumOfMonths, MONTH )
VAR Result =
    CALCULATE (
        SELECTEDMEASURE (),
        REMOVEFILTERS ( 'Dates' ),
        KEEPFILTERS ( Previous ),
        USERELATIONSHIP ( 'DatesPeriod2'[Date], 'Dates'[Date] )
    )
RETURN Result3600a29200dabe878df2bd492987798d.jpeg

字段参数实现动态日期轴

字段参数真的是微软去年至今的更新中最好用的功能,比如日期轴实现动态的年季月切换,就不再需要写那么多代码来组合一张新表了,只需要在新建参数的时候选择我们需要的列即可。

fda422da72e4c1985174b2bfb0e17663.jpeg

接下来看下效果

6376047f21220d1496e7eef2955b4e78.jpeg

细心的肯定已经发现了,图中x轴的顺序的错乱的,我们来手动修改下排序,当我们切换为其他类别时,再切换回来排序又乱了。。。

d251b46aeca0d548872b9a433187bcdc.jpeg

这是微软的bug,在去年时就已经有用户提交给微软了,一年快过去了。。。

这个bug修复起来,也相对简单,给我们字段参数中用到列都加一个排序列,比如年份列,可以复制一份然后对原始的年份列排序。

069b83db5fa5de8dd144598a76930aec.jpeg

再来看下效果,排序正常了。

6a8689d68379eb6be9b1368298daa8b8.jpeg

字段参数实现动态日期轴进阶

现在需求再进一步,时间轴要根据所选的时间范围自动切换,比如选择的范围大于36个月,就显示年趋势,范围小于30天就显示为日趋势。

实现起来也相对简单,只需要新建一个度量来判断就可以了,为了简单起见,这里对月的判断直接是除以30,如果筛选器是月的话,也可以直接统计月份数。

Flag = 
VAR Months = COUNT(Dates[Date])/30
VAR Periods = SELECTEDVALUE('动态日期轴 参数'[Order])
RETURN 
SWITCH(
    TRUE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Months&nbsp;<=&nbsp;1&nbsp;&&&nbsp;Periods&nbsp;=&nbsp;0,&nbsp;1,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Months&nbsp;>&nbsp;1&nbsp;&&&nbsp;Months&nbsp;<=&nbsp;3&nbsp;&&&nbsp;Periods&nbsp;=&nbsp;1,&nbsp;1,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Months&nbsp;>&nbsp;3&nbsp;&&&nbsp;Months&nbsp;<=&nbsp;6&nbsp;&&&nbsp;Periods&nbsp;=&nbsp;2,&nbsp;1,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Months&nbsp;>&nbsp;6&nbsp;&&&nbsp;Months&nbsp;<=&nbsp;24&nbsp;&&&nbsp;Periods&nbsp;=&nbsp;3,&nbsp;1,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Months&nbsp;>&nbsp;24&nbsp;&&&nbsp;Periods&nbsp;=&nbsp;4,&nbsp;1,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;)

之后在图表上加一个筛选条件,是对字段参数中的排序列取top1

baf5d3d19effb0ae073e68bed9d2fd65.jpeg

看下效果

bcd178dfa0322e99d1f4c43826c3d746.jpeg

总结

计算组和字段参数无疑是Power BI中最强大的两个功能,借助于这两个功能可以实现很多复杂的效果,只不过过程中还是需要注意是否还有一些小Bug,毕竟微软改起bug来真的很佛。

引用链接

[1]&nbsp;Show previous 6 months of data from single slicer selection - SQLBI --- 显示来自单个切片器选择的前 6 个月的数据 - SQLBI:&nbsp;https://www.sqlbi.com/articles/show-previous-6-months-of-data-from-single-slicer-selection/


### 在 Power BI 中设置的顺序 在 Power BI 中,对进行排序是一个常见的需求,尤其是在处理日期、月份或其他具有特定逻辑顺序的数据时。以下是关于如何实现不同场景下的排序的方法。 #### 默认情况下按字母或数值顺序排序 当将字段拖放到可视化图表中时,默认会按照字母顺序(对于字符串)或数值大小(对于数字)来显示数据[^1]。然而,这种默认行为可能不符合实际业务需求,因此需要手动调整排序方式。 #### 使用 Power Query 编辑器预处理数据 如果希望从源头解决排序问题,则可以在加载数据阶段就做好准备。通过 **Power Query Editor** 对原始表格中的某些维度增加辅助列用于指示其应有的次序位置。例如针对月份名称可以新增加一列表示对应自然年内的第几个月;而对于像产品类别这样的自定义序列也可以同样操作——即创建一个新的索引型字段作为参照依据[^3]。 #### 利用 “Sort By Column” 功能快速设定 另一种更为简便的方式就是利用报表视图里的“Sort by column”选项直接指定另一个关联属性来做为主键来进行重新排列展示效果。具体做法如下: - 首先确认存在两组相互匹配关系密切但表现形式不同的两个系列值; - 接着右键点击目标维度所在区域并选择菜单项“Sort by column”,然后选取那个能够体现正确先后秩序的新建或者已有备用字段即可完成更改动作[^4]。 #### 特殊情况:Python脚本绘图时的手动控制X顺序 当采用 Python 脚本来绘制图形时,由于外部库并不自动识别来自 Power BI 的内部元数据结构特性,所以此时就需要借助 Pandas DataFrame 来显式声明分类变量及其期望呈现出来的固定队列模式。可以通过重置 index 或者调用 category 类型强制规定 level 参数的办法达成目的[^2]。 ```python import pandas as pd categories = ['DECO', 'HOME','OUTDOOR','PARTY','1 MKG','2 MKG'] df['Category'] = df['Category'].astype(pd.api.types.CategoricalDtype(categories=categories, ordered=True)) ``` 以上代码片段展示了如何使用Pandas将DataFrame的一列转换成带有序性的Categorical类型,并指定了所需的顺序。 ### 总结 综上所述,在Power BI环境中可以根据实际情况选用多种策略去定制化我们的坐标系布局样式。无论是依赖于前端交互界面提供的便捷工具还是深入挖掘后台编程接口的能力范围之内都能够找到满足项目特殊要求的最佳实践路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值