DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension)
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)的更多相关文章
- DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)
跟大家的交流是我的动力. :) DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★ ...
- 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) - 多时间段数值对比 难度: ★☆☆☆☆ ...
随机推荐
- 邻居子系统 之 邻居表的初始化neigh_table_init
概述 邻居子系统支持多种实现,例如ARP,ND等,这些实现需要在其初始化的时候,调用neigh_table_init将邻居表项添加到全局邻居子系统数组中,并对实例中的字段(如hash,定时器等)进行相 ...
- TCP之Nagle算法与TCP_NODELAY
1. Nagle 算法 在一个 Rlogin 连接上客户一般每次发送一个字节到服务器,这就产生了一些 41 字节长的分组:20 字节的 IP 首部.20 字节的 TCP 首部和 1 个字节的数据.在局 ...
- EBS 创建会计科目 小结
1 创建会计科目 方式(以AP发票为例) 1)在发票工作台对单张发票进行创建科目: 参考网址: https://www.cnblogs.com/bruce_zhao/p/3809493.html 备注 ...
- Mysql 纪录用户操作日志
有时,我们想追踪某个数据库操作记录,如想找出是谁操作了某个表(比如谁将字段名改了). 二进制日志记录了操作记录,线程号等信息,但是却没有记录用户信息,因此需要结合init-connect来实现追踪. ...
- CMD命令行管道命令
一.什么是管道命令 管道命令能够将一个命令的执行结果经过筛选,只保留我们需要的信息. 如 dir 命令会显示目录下所有文件夹和文件,可以使用管道命令| findstr "" 将di ...
- 三、SpringBoot启动时JDBC报错:You must configure either the server or JDBC driver (via the serverTimezone configuration property)
错误提示: Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connectio ...
- pandas之时间序列(data_range)、重采样(resample)、重组时间序列(PeriodIndex)
1.data_range生成时间范围 a) pd.date_range(start=None, end=None, periods=None, freq='D') start和end以及freq配合能 ...
- python接口自动化框架搭建
一.在搭建接口自动化测试框架前,我觉得先需要想明白以下几点: ① 目前情况下,绝大部分接口协议是http,所以需要对http协议有个基本的了解,如:http协议请求.响应由哪些部分组成,常用的meth ...
- 阶段3 3.SpringMVC·_07.SSM整合案例_02.ssm整合之搭建环境
创建数据库ssm并创建表account create database ssm; use ssm; create table account( id int primary key auto_incr ...
- 六十四:CSRF攻击与防御之系统准备之病毒网站转账实现
准备一个页面或图片,用于用户访问 一:表单方式 视图 from flask import Flask, render_template app = Flask(__name__) @app.route ...