DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)
跟大家的交流是我的动力。 :)
Update 2019/Jul/11:增加如何生成时间维度表(时刻分钟)文章链接
Update 2017/Oct/06:更新了生成日期为度的脚本- #"Changed Type"
Update 2017/Sep/21 :来信的一些童鞋都用事实表(Fact Table)来作为时间维度的计算,对于简单的计算并没有问题,但是对于复杂的涉及到更多的FilterContext的transition的时候,这样的设计往往就不能实现,所以强烈建议单独建一个时间维度表(Date Dimension)---- 这个涉及到一些些data warehousing的一些基础知识。
还等什么,往下瞅瞅!!
DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)
难度: ★☆☆☆☆(1星)
适用范围: ★★★★★(5星)
这个时间系列想写很久了,今天开始走一小步。也是作为后续关于时间计算文章的基础。 (文末发一个小福利。 )
概况:
关于时间序列的计算是一个很(也)常(很)用(大)的topic,而且应用范围很广,譬如计算同比,环比,根据时间序列预测某个值。必不可少的就是在模型里面有一个日期的维度。
PowerBI提供了一个AutoCalendar的函数来生成一个日期的时间表,很好!但它仅此生成一个日期列。
可素,往往我们需要很多其他的日期属性列,譬如:单独的年,月,日,季度,财年,等等。我们可以添加计算列,把它们一个一个加进来,但是我另外一个model也需要这个时间维度表呢?
重复添加计算列,这个活真的比较无趣。有没有什么好方法去避免呐?
这个就是今天的主题:如何用脚本生成时间维度。(How to use script to generate date dimension)
如何生成时刻分钟维度的文章,请戳这里。
应用场景:
以下是几个应用场景:
复用时间维度表
偷懒不想一个个添加时间属性列
分析时间序列
分析同比环比等需要一个日期维度
最终PowerBI效果显示如下:
要点:
按下面步骤操作,具体M语言是什么,可以忽略。(下面的属性不够用再参考M语言是什么)
1.PowerBI面板>Edit Query进入Qery Editor> New Source > Blank Query>
2. Advanced Edictor,贴入文末脚本并保存。
3.填入参数,点[Invoke]
4.哇啦,你得到一个时间维度表啦,(*^__^*) 嘻嘻……
脚本如下:(拿走,不谢)
脚本使用M语言写的,如果想修改添加其他的列,参考一下M语言。 (又一种语言,╮(╯▽╰)╭)
(StartDate as date, YearsToAppend as number, FinancialYearStartingMonth as number ) =>
let YearsToAppend = YearsToAppend,
FinancialYearStartingMonth= FinancialYearStartingMonth,
StartDate = #date(Date.Year(StartDate), Date.Month(StartDate), Date.Day(StartDate)),
// Generate base table
Source = List.Dates(Date.From(StartDate),YearsToAppend*,#duration(, , , )),
Transformed = List.Transform(Source, each Date.ToRecord(_)),
Tabled = Table.FromList(Transformed,Record.FieldValues,{"Year","Month","Day"}),
//Add Full Date Column
AddDateKey = Table.AddColumn(Tabled,"Date",each Date.FromText(Text.From([Year])&"-"&Text.From([Month])&"-"&Text.From([Day]))),
//DateBKeyConvert = Table.TransformColumnTypes(Date,{{"Date", type date}}),
DateKeyAdded = Table.AddColumn(AddDateKey,"DateKey",each ([Year] * ) + ([Month] * ) + [Day]),
FullDateNameAdded = Table.AddColumn(DateKeyAdded,"DateFullName",each DateTime.ToText(DateTime.From([Date]),"dd MMMM yyyy")),
// Calendar Quarter 季度
CalendarQuarterAdded = Table.AddColumn(FullDateNameAdded, "Calendar Quarter",
each Number.IntegerDivide(Date.Month([Date])-,) +
),
// Calendar Month Number 年月
CalendarMonthNumberAdded = Table.AddColumn(CalendarQuarterAdded, "Calendar Month Number",
each Date.Year([Date]) * + Date.Month([Date])
),
// Is Week Day 工作日 or 周末
WeekDayAdded = Table.AddColumn(CalendarMonthNumberAdded, "IsWeekDay",
each
if
Date.DayOfWeek(DateTime.From([Date]))=Day.Sunday
or
Date.DayOfWeek(DateTime.From([Date]))=Day.Saturday
then else ),
// Day Of Week
DayOfWeek = Table.AddColumn(WeekDayAdded,"DayOfWeek",each Date.DayOfWeek(DateTime.From([Date]))),
// Month Name
MonthName = Table.AddColumn(DayOfWeek,"Month Name",each DateTime.ToText(DateTime.From([Date]),"MMMM")),
// Day of Week Name
DayOfWeekName = Table.AddColumn(MonthName,"Day of Week Name",each DateTime.ToText(DateTime.From([Date]),"dddd")), // Fiscal Year 财年
FiscalYearAdded = Table.AddColumn(DayOfWeekName,
"Fiscal Year",
each
if Date.Month([Date]) >= FinancialYearStartingMonth then
Date.Year([Date]) +
else
Date.Year([Date])
),
// Fiscal Month 财年月份
FiscalQuarterAdded = Table.AddColumn(FiscalYearAdded,
"Fiscal Quarter",
each
if Date.Month([Date])>=FinancialYearStartingMonth then
Number.IntegerDivide((Date.Month([Date])-FinancialYearStartingMonth),) +
else
Number.IntegerDivide(( + Date.Month([Date])-FinancialYearStartingMonth),) +
), #"Changed Type" = Table.TransformColumnTypes(FiscalQuarterAdded,{{"DateFullName", type text}, {"DateKey", Int64.Type}, {"Calendar Quarter", Int64.Type}, {"Calendar Month Number", Int64.Type}, {"IsWeekDay", type logical}, {"DayOfWeek", Int64.Type}, {"Month Name", type text}, {"Day of Week Name", type text}, {"Fiscal Year", Int64.Type}, {"Fiscal Quarter", Int64.Type}, {"Day", Int64.Type}, {"Month", Int64.Type}, {"Year", Int64.Type}, {"Date", Date.Type}})
in
#"Changed Type"
DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)的更多相关文章
- DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension)
DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★★(5星) 这个时间系列想 ...
- DAX/PowerBI系列 - 关于时间系列 - 时间相关数值比较 - 用非自带函数
DAX/PowerBI系列 - 关于时间系列 - 时间相关数值比较 - 用非自带函数 文末有彩蛋,解决蛋疼问题 难度: ★★☆☆☆(2星) 适用范围: ★★★☆☆(3星) 概况: 基于时间的汇总可能是 ...
- DAX/PowerBI系列 - 累计总计(Cumulative Total)
DAX/PowerBI系列 - 累计总计(Cumulative Total) 2017/07/23 更新:B列公式(见最后) 难度: ★★☆☆☆(2星) 适用: ★★☆☆☆(2星) 概况: 这个模式普 ...
- DAX/PowerBI系列 - 库存总价值(Inventory Value)
DAX/PowerBI系列 - 库存总价值(Inventory Value) 欢迎交流与骚扰 难度: ★★☆☆☆(2星) 适用: ★★☆☆☆(2星) 概况: 有多少货(库存)当然重要(对于运营人员), ...
- DAX/PowerBI系列 - 累计总计(Cumulative Total, Running Total)
DAX/PowerBI系列 - 累计总计(Cumulative Total) 2017/07/23 更新:B列公式(见最后) 2019/08/08 更新:在可视化数据的时候,一定要选择日期维度的日期列 ...
- DAX/PowerBI系列 - 父子层级(Parent-Child Hierarchy)
DAX/PowerBI系列 - 父子层级(Parent-Child Hierarchy)参考文章见最后 难度: ◆◆◇◇◇(2星) 应用场景: 其实很多时候对数据汇总都会有层级关系的问题,不过说的不是 ...
- DAX/PowerBI系列 - 参数表(Parameter Table)
DAX/PowerBI系列 - 参数表(Parameter Table) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★☆(4星) 概况: 这个模式比较简单灵活,而且很实用.所用的DAX语句也比较简 ...
- DAX/PowerBI系列 - 玩转阿里云 Alicloud Pricing
DAX/PowerBI系列 - 玩转 阿里云主机 Ali Cloud ECS 难度: ★★☆☆☆(1星) 适用范围: ★★★☆☆(3星) 欢迎交流与骚扰 这是啥: 双十一就到了,码农门,程序猿们有没有 ...
- (玩起来)DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比
盆友们,边看文章边玩,请耐心等待PowerBI load出来~~~~ (7.8秒钟) DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比 难度: ★☆☆☆☆ ...
随机推荐
- Vivado简单调试技能
Vivado简单调试技能 1.关于VIO核的使用 首先配置VIO核: 配置输入输出口的数量5,5 配置输入口的位宽 配置输出口位宽和初始值. 例化与使用: vio_0 U1 ( .clk(clk_27 ...
- springboot问题:解决异常Unable to start embedded container;
使用eclipse创建springboot练习时,当主函数与控制器同时写在同一个类时,启动项目正常运行,而当把主函数单独放在一个类中时,无论是与控制器同包还是控制器所在的包是其子包,都报: org.s ...
- “海市蜃楼”般的逛街体验——VR全景智慧城市常诚
<史记·天官书>:"海旁蜃气像楼台:广野气成宫阙然." 海市蜃楼,简称蜃景,是一种因为光的折射和全反射而形成的自然现象,是地球上物体反射的光经大气折射而形成的虚像. 2 ...
- FLAnimatedImageView处理gif过程
FLAnimatedImageView处理gif过程 时间控制原理 GIF图片每一帧的delayTime可能都不一样: 在展示下一帧的时间控制机制,不能根据以第一帧为准: 或总动画时长除以帧数来简单做 ...
- Android 图片加载框架Glide4.0源码完全解析(二)
写在之前 上一篇博文写的是Android 图片加载框架Glide4.0源码完全解析(一),主要分析了Glide4.0源码中的with方法和load方法,原本打算是一起发布的,但是由于into方法复杂性 ...
- Ubuntu下录音机程序的使用
在Ubuntu中使用系统自带的录音机程序可以录制电脑的音频输出(比如,电脑正在播放视频的声音),或录制外部环境音频输入(比如,自己说话的声音) 1.录制电脑音频输出 在“硬件”选项中,将”选中设备的设 ...
- Bash启动选项
Bash选项可以用来控制它的行为,有两种选项:单字符选项和多字符选项,多字符选项必须出现在单字符选项以前.1)单字符选项:由一个减号和一个字符组成2)多字符选项:由两个减号和多个字符组成 常用选项:- ...
- Javascript实现Base64解码
工作中需要用到,在stackoverflow中找到的,实践证明可用. function decode_base64(s) { var e = {}, i, k, v = [], r = '', w = ...
- Perl格式化输出
Perl格式化输出 问题阐述 有时我们需要大量的重复数据,使用手工易于出错及比较繁琐.抓取特征,可以使用Perl脚本轻松搞定. 输出数据格式 主要特点 随机数生成 格式化输出 序列递增 Perl脚本 ...
- Mac下安装MySQL、Workbench以及建数据库建表最基础操作
刚用上Mac,什么都不懂,加之以前还没有用过mysql,就想着在Mac上装一个mysql来自己玩,奈何,在网上找了大半天,没有一个干货!愤怒!下面是我安装的过程,希望能帮到和我情况差不多的朋友 首 ...