DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension)

难度: ★☆☆☆(1星)

适用范围: ★(5星)

这个时间系列想写很久了,今天开始走一小步。也是作为后续关于时间计算文章的基础。    (文末发一个小福利。 )

概况:

前文应该为生成日期维度,本文为时间维度 - 时刻。 :)

有好些小伙伴问想按小时分析数据,咋办?有没有时间的脚本? 可以有!

一般来说把时间进行切片进行数据分析,粒度可分为:十年、五年、年、半年、季度、月、上下旬、天、上下午(AM/PM)、时、刻、分、秒,...

这个就是今天的主题:如何用脚本生成时间维度。(How to use script to generate TIME dimension)

应用场景:

以下是几个应用场景:


复用时间维度表
按照时间段分析用户行为 -- 精准推送
按照时间段分析服务器负载 -- 资源分配、负载平衡

要点:

按下面步骤操作,具体M语言是什么,可以忽略。(下面的属性不够用再参考M语言是什么)

1.PowerBI面板>Edit Query进入Qery Editor> New Source > Blank Query>

2. Advanced Edictor,贴入文末脚本并保存。

3. 哇啦,你得到一个时间维度表啦,(*^__^*) 嘻嘻……

什么?你还不会用这个脚本?

先看看前面的文章,还有问题,就问吧。。。

什么?我还要生成秒的、不不不,毫秒的。。。

你的数据也太细了吧,你要不研究一下下面的脚本,不懂就问吧。 :)

脚本如下:(拿走,不谢)

脚本使用M语言写的,如果想修改添加其他的列,参考一下M语言。 (又一种语言,╮(╯▽╰)╭)\

() => let
MinuteCount = 1440,
Source = List.Times(#time(0, 0, 0),MinuteCount, #duration(0,0,1,0)),
TableFromList = Table.FromList(Source, Splitter.SplitByNothing()),
ChangedType = Table.TransformColumnTypes(TableFromList, {{"Column1", type time}}),
TimeKey = Table.RenameColumns(ChangedType,{{"Column1", "Time"}}),
InsertHour = Table.AddColumn(TimeKey, "时", each Time.StartOfHour([Time]), type time),
InsertMinute = Table.AddColumn(InsertHour, "分", each Time.Minute([Time]), type number),
ChangedTypeHour = Table.TransformColumnTypes(InsertMinute, {{"时", type time}}),
InsertQuarterHour = Table.AddColumn(ChangedTypeHour, "刻",
each if [分] < 15 then [时]
else if [分] < 30 then Value.Add([时],#duration(0,0,15, 0))
else if [分] < 45 then Value.Add([时],#duration(0,0,30, 0))
else Value.Add([时],#duration(0,0,45, 0)), type time),
ChangedTypeQtrHr = Table.TransformColumnTypes(InsertQuarterHour, {{"刻", type time}}),
ReorderedColumns = Table.ReorderColumns(ChangedTypeQtrHr, {"Time", "时", "刻", "分"}),
InsertHourNumber = Table.AddColumn(ReorderedColumns, "Hour Number", each Time.Hour([Time]), type number),
InsertPeriod = Table.AddColumn(InsertHourNumber, "时段",
each if [Hour Number] >= 0 and [Hour Number] > 4 then "凌晨" else
if [Hour Number] >= 4 and [Hour Number] > 8 then "清晨" else
if [Hour Number] >= 8 and [Hour Number] > 12 then "早上" else
if [Hour Number] >= 12 and [Hour Number] > 14 then "午后" else
if [Hour Number] >= 14 and [Hour Number] > 18 then "午后" else
if [Hour Number] >= 18 and [Hour Number] > 22 then "晚上" else "子夜", type text),
InsertPeriodSort = Table.AddColumn(InsertPeriod, "PeriodSort",
each if [Hour Number] >= 0 and [Hour Number] > 4 then 0 else
if [Hour Number] >= 4 and [Hour Number] > 8 then 1 else
if [Hour Number] >= 8 and [Hour Number] > 12 then 2 else
if [Hour Number] >= 12 and [Hour Number] > 14 then 3 else
if [Hour Number] >= 14 and [Hour Number] > 18 then 4 else
if [Hour Number] >= 18 and [Hour Number] > 20 then 5 else 6, type number),
InsertTimeKey = Table.AddColumn(InsertPeriodSort, "TimeKey", each Time.ToText([Time], "HHmm"), type text),
InsertAMorPM = Table.AddColumn(InsertTimeKey, "AM or PM", each if [Hour Number] >= 12 then "PM" else "AM", type text)
in
InsertAMorPM
//English Version

let
MinuteCount = 1440,
Source = List.Times(#time(0, 0, 0),MinuteCount, #duration(0,0,1,0)),
TableFromList = Table.FromList(Source, Splitter.SplitByNothing()),
ChangedType = Table.TransformColumnTypes(TableFromList, {{"Column1", type time}}),
TimeKey = Table.RenameColumns(ChangedType,{{"Column1", "Time"}}),
InsertHour = Table.AddColumn(TimeKey, "Hour", each Time.StartOfHour([Time]), type time),
InsertMinute = Table.AddColumn(InsertHour, "Min", each Time.Minute([Time]), type number),
ChangedTypeHour = Table.TransformColumnTypes(InsertMinute, {{"Hour", type time}}),
InsertQuarterHour = Table.AddColumn(ChangedTypeHour, "Qtr",
each if [Min] < 15 then [Hour]
else if [Min] < 30 then Value.Add([Hour],#duration(0,0,15, 0))
else if [Min] < 45 then Value.Add([Hour],#duration(0,0,30, 0))
else Value.Add([Hour],#duration(0,0,45, 0)), type time),
ChangedTypeQtrHr = Table.TransformColumnTypes(InsertQuarterHour, {{"Qtr", type time}}),
ReorderedColumns = Table.ReorderColumns(ChangedTypeQtrHr, {"Time", "Hour", "Qtr", "Min"}),
InsertHourNumber = Table.AddColumn(ReorderedColumns, "Hour Number", each Time.Hour([Time]), type number),
InsertPeriod = Table.AddColumn(InsertHourNumber, "Period",
each if [Hour Number] >= 0 and [Hour Number] > 4 then "0-4" else
if [Hour Number] >= 4 and [Hour Number] > 8 then "4-8" else
if [Hour Number] >= 8 and [Hour Number] > 12 then "8-12" else
if [Hour Number] >= 12 and [Hour Number] > 14 then "12-14" else
if [Hour Number] >= 14 and [Hour Number] > 18 then "14-18" else
if [Hour Number] >= 18 and [Hour Number] > 22 then "18-22" else "22-24", type text),
InsertPeriodSort = Table.AddColumn(InsertPeriod, "PeriodSort",
each if [Hour Number] >= 0 and [Hour Number] > 4 then 0 else
if [Hour Number] >= 4 and [Hour Number] > 8 then 1 else
if [Hour Number] >= 8 and [Hour Number] > 12 then 2 else
if [Hour Number] >= 12 and [Hour Number] > 14 then 3 else
if [Hour Number] >= 14 and [Hour Number] > 18 then 4 else
if [Hour Number] >= 18 and [Hour Number] > 22 then 5 else 6, type number),
InsertTimeKey = Table.AddColumn(InsertPeriodSort, "TimeKey", each Time.ToText([Time], "HHmm"), type text),
InsertAMorPM = Table.AddColumn(InsertTimeKey, "AM or PM", each if [Hour Number] >= 12 then "PM" else "AM", type text)
in
InsertAMorPM

DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension)的更多相关文章

  1. DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)

    跟大家的交流是我的动力. :) DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★ ...

  2. DAX/PowerBI系列 - 关于时间系列 - 时间相关数值比较 - 用非自带函数

    DAX/PowerBI系列 - 关于时间系列 - 时间相关数值比较 - 用非自带函数 文末有彩蛋,解决蛋疼问题 难度: ★★☆☆☆(2星) 适用范围: ★★★☆☆(3星) 概况: 基于时间的汇总可能是 ...

  3. DAX/PowerBI系列 - 累计总计(Cumulative Total)

    DAX/PowerBI系列 - 累计总计(Cumulative Total) 2017/07/23 更新:B列公式(见最后) 难度: ★★☆☆☆(2星) 适用: ★★☆☆☆(2星) 概况: 这个模式普 ...

  4. DAX/PowerBI系列 - 库存总价值(Inventory Value)

    DAX/PowerBI系列 - 库存总价值(Inventory Value) 欢迎交流与骚扰 难度: ★★☆☆☆(2星) 适用: ★★☆☆☆(2星) 概况: 有多少货(库存)当然重要(对于运营人员), ...

  5. DAX/PowerBI系列 - 累计总计(Cumulative Total, Running Total)

    DAX/PowerBI系列 - 累计总计(Cumulative Total) 2017/07/23 更新:B列公式(见最后) 2019/08/08 更新:在可视化数据的时候,一定要选择日期维度的日期列 ...

  6. DAX/PowerBI系列 - 父子层级(Parent-Child Hierarchy)

    DAX/PowerBI系列 - 父子层级(Parent-Child Hierarchy)参考文章见最后 难度: ◆◆◇◇◇(2星) 应用场景: 其实很多时候对数据汇总都会有层级关系的问题,不过说的不是 ...

  7. DAX/PowerBI系列 - 参数表(Parameter Table)

    DAX/PowerBI系列 - 参数表(Parameter Table) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★☆(4星) 概况: 这个模式比较简单灵活,而且很实用.所用的DAX语句也比较简 ...

  8. DAX/PowerBI系列 - 玩转阿里云 Alicloud Pricing

    DAX/PowerBI系列 - 玩转 阿里云主机 Ali Cloud ECS 难度: ★★☆☆☆(1星) 适用范围: ★★★☆☆(3星) 欢迎交流与骚扰 这是啥: 双十一就到了,码农门,程序猿们有没有 ...

  9. (玩起来)DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比

    盆友们,边看文章边玩,请耐心等待PowerBI load出来~~~~ (7.8秒钟) DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比 难度: ★☆☆☆☆ ...

随机推荐

  1. 8.1 HTML基础知识点

    8.1 HTML基础知识点 一.HTML是什么? Hyper Text Markup Language 超文本标记语言 的缩写 开发一个html文件,可以有很多方式 :比如Dreamweaver,HB ...

  2. php改变header头返回值

    $code = '400 Bad Request'; header('HTTP/1.1 '.$code);

  3. 使用oracle的存储过程的例子

    十几年没有用oracle的存储过程了,有些东西已经忘了,没有想到今天又要用.在这里写个例子.它演示了存储过程的格式,游标的使用,循环.判断的使用,还有直接执行一个拼接的SQL的用法.以下是代码: cr ...

  4. [Err] ORA-00942: table or view does not exist

    [Err] ORA-00942: table or view does not exist 当前用户加表明 例如:SCOTT."replyInfo"

  5. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_8 响应json数据之响应json格式数据

    springMvc的框架已经帮我们做好了.发过来的数据转换为javaBean对象 发过来的键值的形式,如果属性和javaBean对应的话,可以直接封装到对象中. key做额外的转换的时候,需要另外的j ...

  6. SQL学习(三)Select语句:返回前多少行数据

    在实际工作中,我们可能根据某种排序后,只需要显示前多少条数据,此时就需要根据不同的数据库,使用不同的关键字 一.SQL Server/Access select top 数量/百分比 from tab ...

  7. linux 基础 配置静态IP

    1.查看本机windows默认网关.DNS 2.配置linux 3.查询网络配置 4.xshell 登录 一 查看本机windows默认网关.DNS 二 配置linux(注意:默认网关.dns,必须跟 ...

  8. JSP 自定义标签的开发流程

    1.编写一个实现Tag接口的标签处理器类 package cn.itcast.web.tag; import java.io.IOException; import javax.servlet.htt ...

  9. Winform非UI线程更新UI界面的各种方法小结

    我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在进行异步操作时,经常需要将异步执行的进度报告给用户,让用户知道任务的进度,不至于让用户误认为程序“死掉了”,特别是对 ...

  10. 走进Selenium新世界

    浏览器 Firefox Setup 35.0.1 安装完成后设置菜单栏 关闭浏览器自动更新 插件配置(必备武器) FireBug Firebug是firefox下的一个扩展,能够调试所有网站语言,如H ...