Power BI日期表创建方式汇总

本文总结了Power BI中创建日期表的三种方法:Excel公式法、Power Query M函数法和DAX函数法。通过Excel公式可以快速生成基础日期表,Power Query则提供了自定义年份范围的灵活性,而DAX提供了多种函数组合,如ADDCOLUMNS与CALENDAR,GENERATE与CALENDAR,以及GENERATE与CALENDARAUTO,用于生成和优化日期表。
  • 在日常使用PBI做数据分析时,最长用到的就是日期维表了,这里把日期表的生成方法做一下汇总,分别使用Excel公式、Power Query的M函数以及DAX生成日期表
  • 下图为我们要生成的日期表样式:
    在这里插入图片描述
  1. Excel公式法
    在A1:H1中输入日期表的表头,然后在A2:H2中分别输入以下公式:

    A2=2020-01-01
    B2=YEAR(A2)
    C2="Q"&LEN(2^MONTH(A2))
    D2=RIGHT("0"&MONTH(A2),2)
    E2=DAY(A2)
    F2=B2&C2
    G2=B2*100+D2
    H2=WEEKDAY(A2,2)
    

    然后选中A2:H2,向下公式填充到731行,就可得到从2020到2021年的日期表

  2. Power Query M函数法
    进入PQ编辑器中,新建空查询,打开高级编辑器,把里面的代码全部删除,然后把以下代码粘贴到高级编辑器中

    (optional 请输入开始年份 as number,
    optional 请输入结束年份 as number)=>
    let
    x = 请输入开始年份, 
    y = if 请输入结束年份 = null
    then 请输入开始年份 else 请输入结束年份,
    begin_date = if x = null
    then #date(Date.Year(DateTime.LocalNow()),1,1) 
    else #date(x,1,1), 
    end_date = if y = null then #date(Date.Year(DateTime.LocalNow()),12,31)
    else #date(y,12,31), 
    list = {1..Number.From(end_date)-Number.From(begin_date)+1},
    dates = List.Transform( list , (item)=> Date.AddDays(begin_date,item-1) ), 
    table = Table.TransformColumnTypes(Table.RenameColumns(Table.FromList(dates, 
    Splitter.SplitByNothing(), null, null, ExtraValues.Error),{{"Column1", "日期"}}),{{"日期", type date}}), 
    year_id = Table.AddColumn(table,"年度", each Date.Year([日期]), type number), 
    quarter_name = Table.AddColumn(year_id, "季度", each "Q"&Text.From(Date.QuarterOfYear([日期]))), 
    month_id = Table.AddColumn(quarter_name, "月份", each Text.PadStart(Text.From(Date.Month([日期])),2,"0")),
    data_id=Table.AddColumn(month_id,"日", each Date.Day([日期]), type number), 
    year_quarter_id = Table.AddColumn(data_id, "年度季度", each Text.From([年度])&[季度]), 
    year_month_id = Table.AddColumn(year_quarter_id, "年度月份", each Date.Year([日期])*100+ Date.Month([日期]), type number), 
    day_in_week = Table.AddColumn(year_month_id, "星期几", each Number.Mod(Date.DayOfWeek([日期])+6,7)+1, type number)
    in
    day_in_week
    

    点击确定后将出现如下窗口
    在这里插入图片描述
    输入开始的年份和结束的年份,点击“调用”,就会生成一个标准的日期表

  3. DAX函数法
    用DAX生成日期表,使用不同的函数都可以做到(在PowerBI Desktop中新建表,输入下面的DAX代码就可以了),常用的有以下几种组合:

    ① ADDCOLUMNS与CALENDAR函数:

    日期表1 =
    ADDCOLUMNS (
    CALENDAR (DATE(2017,1,1), DATE(2018,12,31)),
    "年度", YEAR ( [Date] ),
    "季度", "Q" & FORMAT ( [Date], "Q" ),
    "月份", FORMAT ( [Date], "MM" ),
    "日",FORMAT ( [Date], "DD" ),
    "年度季度", FORMAT ( [Date], "YYYY" ) & "Q" & FORMAT ( [Date], "Q" ),
    "年度月份", FORMAT ( [Date], "YYYY/MM" ),
    "星期几", WEEKDAY ( [Date],2 )
    )
    

    ② GENERATE和CALENDAR函数

    日期表2 = 
    GENERATE ( 
    CALENDAR ( DATE ( 2017, 1, 1 ), DATE ( 2018, 12, 31 ) ), 
    VAR currentDay = [Date]
    VAR year = YEAR ( currentDay )
    VAR quarter = "Q" & FORMAT ( currentDay, "Q" )
    VAR month = FORMAT ( currentDay, "MM" )
    VAR day = DAY( currentDay ) 
    VAR weekid = WEEKDAY ( currentDay,2)
    RETURN ROW ( 
    "年度", year ,
    "季度",quarter,
    "月份", month,
    "日", day, 
    "年度季度", year&quarter, 
    "年度月份", year&month, 
    "星期几", weekid
    )
    )
    

    这里运用了VAR函数,据说这个代码可以节省内存、提升运行速度

    ③ GENERATE与CALENDARAUTO函数

    日期表3= 
    GENERATE ( 
    CALENDARAUTO(),
    VAR currentDay = [Date]
    VAR year = YEAR ( currentDay )
    VAR quarter = "Q" & FORMAT ( currentDay, "Q" )
    VAR month = FORMAT ( currentDay, "MM" )
    VAR day = DAY( currentDay ) 
    VAR weekid = WEEKDAY ( currentDay,2)
    RETURN ROW ( 
    "年度", year ,
    "季度",quarter,
    "月份", month,
    "日", day, 
    "年度季度", year&quarter, 
    "年度月份", year&month, 
    "星期几", weekid
    )
    )
    

    同样使用了VAR函数,这段代码中并没有指定起止日期 —— CALENDARAUTO函数可以自动检测模型中其他表中所有日期,然后生成涵盖这些日期的整年日期表

### 实现按周汇总日期数据 在 Power BI 中实现按周汇总日期数据涉及创建一个有效的日期维度表并利用 DAX 函数来计算每周的汇总值。具体操作如下: #### 创建日期维度表 首先,需要构建一个专门用于时间分析的日期表。此表格应至少包含每一年每一天的具体信息,并且要标记为日期表以便于后续的时间智能函数应用。 对于日期表的建立可以采用多种方式,在Power Query中编写M语言脚本或是直接运用DAX语句生成都是可行的选择[^2]。 ```dax DateTable = ADDCOLUMNS ( CALENDAR ( DATE ( YEAR ( MIN ( 'Fact.Sale'[InvoiceDateKey] ) ), 1, 1 ), DATE ( YEAR ( MAX ( 'Fact.Sale'[InvoiceDateKey] ) ), 12, 31 ) ), "Year", YEAR ( [Date] ), "Month", FORMAT ( [Date], "MMMM" ), "DayOfWeek", WEEKDAY ( [Date], 2 ), "WeekOfYear", WEEKNUM ( [Date], 2 ) ) ``` 这段代码定义了一个名为 `DateTable` 的新表,其中包含了年份、月份名称、星期几编号(周一作为一周的第一天)、以及每年中的第几周等字段。这有助于更灵活地按照不同周期进行聚合查询。 #### 计算每周销售额总计 有了上述准备好的日期表之后,就可以很方便地基于它来进行各种时间上的统计运算。下面展示的是如何求得每一周内所有交易记录对应的销售总额。 ```dax WeeklySalesAmount = CALCULATE( SUM('Fact.Sale'[SaleAmount]), ALLEXCEPT(DateTable, DateTable[Year], DateTable[WeekOfYear]) ) ``` 该度量表达式通过 `SUM()` 来累加指定列下的数值;而 `ALLEXCEPT()` 则用来保留当前上下文中关于年度和年内周数的信息不变,从而确保每次只针对特定的一周范围内的事实表条目执行求和动作。 最后一步是在报表视图里添加图表组件并将刚刚创建好的 `WeeklySalesAmount` 度量拖放到相应的轴上即可直观看到各时间段的变化趋势。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值