首页 > 其他分享 >Power BI 利用函数动态生成日期表

Power BI 利用函数动态生成日期表

时间:2023-12-05 21:02:29浏览次数:24  
标签:函数 Power Year BI each Date Table AddColumn type

日期表是万能的维度表,本文介绍一种在Power Query中快速生成日期表的方法,只需要创建一个函数,函数接受三个参数:开始日期,结束日期,财年的开始月份,然后就可以生成一个完整的日期表。

PowerQuery中创建一个空查询,

Power BI 利用函数动态生成日期表_PowerBI

切入高级模式:

Power BI 利用函数动态生成日期表_PowerBI_02

放入以下代码:

let fnDateTable = (StartDate as date, EndDate as date, FYStartMonth as number) as table =>

  let

    DayCount = Duration.Days(Duration.From(EndDate - StartDate)),

    Source = List.Dates(StartDate,DayCount,#duration(1,0,0,0)),

    TableFromList = Table.FromList(Source, Splitter.SplitByNothing()),    
    ChangedType = Table.TransformColumnTypes(TableFromList,{{"Column1", type date}}),

    RenamedColumns = Table.RenameColumns(ChangedType,{{"Column1", "Date"}}),

    InsertYear = Table.AddColumn(RenamedColumns, "Year", each Date.Year([Date]),type text),

    InsertYearNumber = Table.AddColumn(RenamedColumns, "YearNumber", each Date.Year([Date])),

    InsertQuarter = Table.AddColumn(InsertYear, "QuarterOfYear", each Date.QuarterOfYear([Date])),

    InsertMonth = Table.AddColumn(InsertQuarter, "MonthOfYear", each Date.Month([Date]), type text),

    InsertDay = Table.AddColumn(InsertMonth, "DayOfMonth", each Date.Day([Date])),

    InsertDayInt = Table.AddColumn(InsertDay, "DateInt", each [Year] * 10000 + [MonthOfYear] * 100 + [DayOfMonth]),

    InsertMonthName = Table.AddColumn(InsertDayInt, "MonthName", each Date.ToText([Date],"MMMM","en-US"), type text),

    InsertCalendarMonth = Table.AddColumn(InsertMonthName, "MonthInCalendar", each (try(Text.Range([MonthName],0,3)) otherwise [MonthName]) & " " & Number.ToText([Year])),

    InsertCalendarQtr = Table.AddColumn(InsertCalendarMonth, "QuarterInCalendar", each "Q" & Number.ToText([QuarterOfYear]) & " " & Number.ToText([Year])),

    InsertDayWeek = Table.AddColumn(InsertCalendarQtr, "DayInWeek", each Date.DayOfWeek([Date])+1),

    InsertDayName = Table.AddColumn(InsertDayWeek, "DayOfWeekName", each Date.ToText([Date], "dddd","en-US"), type text),

    InsertWeekEnding = Table.AddColumn(InsertDayName, "WeekEnding", each Date.EndOfWeek([Date]), type date),

    InsertWeekNumber= Table.AddColumn(InsertWeekEnding, "Week Number", each Date.WeekOfYear([Date])),

    InsertMonthnYear = Table.AddColumn(InsertWeekNumber,"MonthnYear", each [Year] * 10000 + [MonthOfYear] * 100),

    InsertQuarternYear = Table.AddColumn(InsertMonthnYear,"QuarternYear", each [Year] * 10000 + [QuarterOfYear] * 100),

    ChangedType1 = Table.TransformColumnTypes(InsertQuarternYear,{{"QuarternYear", Int64.Type},{"Week Number", Int64.Type},{"Year", type text},{"MonthnYear", Int64.Type}, {"DateInt", Int64.Type}, {"DayOfMonth", Int64.Type}, {"MonthOfYear", Int64.Type}, {"QuarterOfYear", Int64.Type}, {"MonthInCalendar", type text}, {"QuarterInCalendar", type text}, {"DayInWeek", Int64.Type}}),

    InsertShortYear = Table.AddColumn(ChangedType1, "ShortYear", each Text.End(Text.From([Year]), 2), type text),

    AddFY = Table.AddColumn(InsertShortYear, "FY", each "FY"&(if [MonthOfYear]>=FYStartMonth then Text.From(Number.From([ShortYear])+1) else [ShortYear])),

    #"Renamed Columns" = Table.RenameColumns(AddFY,{{"Date", "DateAltkey"}, {"DateInt", "Datekey"}, {"MonthOfYear", "MonthNumber"}, {"DayInWeek", "WeekdayNumber"}, {"DayOfWeekName", "WeekdayName"}}),

    #"Reordered Columns" = Table.ReorderColumns(#"Renamed Columns",{"Datekey", "DateAltkey", "Year", "QuarterOfYear", "MonthNumber", "MonthName", "DayOfMonth", "MonthInCalendar", "QuarterInCalendar", "WeekdayNumber", "WeekdayName", "WeekEnding", "Week Number", "MonthnYear", "QuarternYear", "ShortYear", "FY"})

in

    #"Reordered Columns"

in

    fnDateTable

放入代码后的效果如下:

Power BI 利用函数动态生成日期表_PowerBI_03

点击"Done"返回 Power Query,可以看到生成的函数界面如下:

Power BI 利用函数动态生成日期表_PowerBI_04

起始日期:2020/7/1

结束日期:2025/6/30

财政月份: 7

点击生成即可生成一个5年的日期表了。

Power BI 利用函数动态生成日期表_PowerBI_05

生成的日期表如下:

Power BI 利用函数动态生成日期表_PowerBI_06

如果你是英文版的系统,将如下语句:

InsertDayWeek = Table.AddColumn(InsertCalendarQtr, "DayInWeek", each Date.DayOfWeek([Date])+1),

改为:

InsertDayWeek = Table.AddColumn(InsertCalendarQtr, "DayInWeek", each Date.DayOfWeek([Date], 0)),

再到生成表中,对WeekdayNumber列进行查找替换,查找0替换为7,这样可以确保星期是正确的,因为有的语言星期是从周日算起,有的是从周一算起。

标签:函数,Power,Year,BI,each,Date,Table,AddColumn,type
From: https://blog.51cto.com/u_13190077/8695609

相关文章

  • 无涯教程-Erlang - file_read函数
    有一种方法可以允许一次读取文件的所有内容,这是通过file_read方法完成的。语法file_read(filename)参数filename-这是需要读取的文件名。返回值文件的全部内容。-module(helloLearnfk).-export([start/0]).start()->Txt=file:read_file("Newfile.txt"),i......
  • 1、zabbix通过函数实现多个主机宕机告警
    在用云厂商+idc机房的时候,网络环境比较复杂,会出现一些未知的网络上的波动造成一些影响。我们通过监控可以去监控主机是不是可用的,网络如果出现问题可能会出现批量的告警。这个时候我们需要电话告警来升级,可以实现的方式有很多。下面我们通过zabbix的函数来实现zabbix6.0.1的实现......
  • template包 字符串函数
    字符串函数https://blog.gmem.cc/gotpl函数说明abbrev缩写参数,超出的字符以...代替。例如 abbrev 5 "helloworld"输出 he...abbrevbothabbrevbothNSTR:从双侧缩写trunctruncNSTR:截断到指定长度trim去除空白trimAlltrimAllTSTR:去除所有指定......
  • 无涯教程-Erlang - sort函数
    对元素列表进行排序。sort-语法sort(lst)Lst - 需要排序的元素列表。sort-返回值返回元素的排序列表。-module(helloLearnfk).-import(lists,[sort/1]).-export([start/0]).start()->Lst1=[5,6,4],io:fwrite("~p~n",[sort(Lst1)]).当我们运行......
  • 无涯教程-Erlang - reverse函数
    反转元素列表。reverse-语法reverse(lst)Lst  - 需要反转的元素列表。reverse-返回值返回元素的反向列表。-module(helloLearnfk).-import(lists,[reverse/1]).-export([start/0]).start()->Lst1=[1,2,3],io:fwrite("~p~n",[reverse(Lst1)]).......
  • Python数字处理:掌握核心函数与技巧
    在数据分析、科学计算和自动化脚本中,数字处理是Python编程的一个核心部分。Python提供了一系列内建函数和标准库,使得数字处理变得既简单又强大。在本篇博客中,我们将深入探讨Python中的数字处理函数,并提供一些实用的技巧,以帮助你提高编程效率和精度。1.基本数学函数Python的内建函......
  • Django中ForeignKey函数详解
    在Django中,ForeignKey是一个数据库模型字段,用于创建多对一(many-to-one)的关系。它实质上是数据库表之间的一个链接,指向另一个模型的实例。在Django的ORM(对象关系映射)系统中,ForeignKey字段非常重要,因为它允许模型间的数据关联和交互。基本用法在Django模型中定义ForeignKey......
  • 无涯教程-Erlang - merge函数
    返回通过合并ListOfLists的所有子列表形成的排序列表。merge-语法merge(ListsofLists)ListsofLists -需要合并的列表集合。merge-返回值返回元素的合并列表。-module(helloLearnfk).-import(lists,[merge/1]).-export([start/0]).start()->io:fwri......
  • BigDecimal处理Double类型精度问题
    最近发现工程里出现金额精度问题,记录下使用区别:publicstaticvoidmain(String[]args){Doublea=0.1;BigDecimalb=newBigDecimal(a);BigDecimalc=BigDecimal.valueOf(a);System.out.println("bis:"+b);System.out......
  • C++运行期多态和编译期多态(以不同的模板参数调用不同的函数)
    在面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态;在泛型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态。<h1"="">1运行期多态运行期多态的设计思想要归结到类继承体系的设计上去。对......