加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,还可以提问交流。
PowerQuery中的数据类型如下:
为了确保数据的准确性,PowerQuery的M语言是强数据类型语言。不同数据类型的字段之间不能直接进行运算,这一点和Excel不同。Excel的文本类型的数字可以进行加减运算,Excel的日期本质上是个天数数字可直接进行加减运算,Excel的数字类型的数字也可以用"&"连接,但PowerQuery就不能直接这么做。
因此,PowerQuery会有如下两种场景转换数据类型:
1 数据加载前通过鼠标“点点点”调整数据类型是数据清洗的必要步骤;
2在添加自定列等公式中使用函数转换数据类型。
举例1
通过鼠标“点点点”转换数据类型,切换日期时间与日期,解决模型中关系两端的日期类型对应不上的坑点。很多数据都是按照时间点在业务系统中做记录的,有一列日期时间列(例如2023/9/13 7:02:30 AM)。数据导入PowerQuery后,使用这个日期时间列与日期表建立关系,在画布中,会发现很多交易数据都没有和日期表对应上,而是对应在空白上。
这个原因比较隐蔽,在PowerQuery中没有对日期时间做处理,数据加载后,在数据视图中,日期时间列的时间没有用而且显示又很长,被改成了日期类型或者短日期格式,从表面上看关系两端的值一模一样,但这种操作并没有改变它内在的值。而日期表的日期列是日期格式,默认的时间是12:00:00 AM。因此,交易数据的日期列的值带有具体的时间点和日期表的日期列的值是有差异的,所以两端对应不上。如果把日期时间列的时间展开,就看出问题了。
解决方案
只需要把数据的日期时间列中的日期提取出来,再去用这个日期列和日期表建立关系就可以了。
打开PowerQuery,点击数据表的日期时间列标题左侧的数据类型图标,选择日期,在跳出的对话框中选择添加新步骤。
也可以选中日期时间列,点击菜单栏转换下的日期,选择仅日期,结果是一样的。
提示:
1 如果时间点有分析需要,可以先进行复制列操作,再进行上述操作。
2 虽然DAX也可以提取日期,但因为此操作属于数据清洗的范畴,建议在PowerQuery中处理。
日期表的日期列和销售表的日期列实现了一一对应,销售数字在日期表日期上实现了聚合,如下:
举例2
添加自定义列的时候,对日期、文本、数字进行相互转换比较常见,以下示例介绍它们之间的转换,.To或.From函数都可以用,掌握其中一种就可以了。
日期转文本,Date.ToText,把日期2022/12/22转为文本221222。注意:转换前需要将列设置为日期数据类型。
Date.ToText(#date(2022, 12, 22), "yyMMdd")
此处第二个参数支持,yyyyMMdd、yyyyMM、yyMM、yyyyMMM、MMdd、MMddd、yyyy-MM-dd等,其中MMM是月份的前3位首字母,ddd是星期的前3位首字母。
数字转文本,Number.ToText,把数字2022和数字12连接生成文本。
Number.ToText(2022)&Number.ToText(12)
文本转日期,Date.FromText,把文本"20221222"转为日期。
Date.FromText("20221222")
此处文本的内容支持:2022-12-22,2022-Dec-22,22-12-22,22-Dec-22,Dec-22,December-22等。
数字转日期1,Date.From,把数字44917转为日期2022/12/22。
Date.From(44917)
数字转日期2,Date.FromText+Number.ToText,把数字20221222转为日期2022/12/22。
Date.FromText(Number.ToText(20221222))
文本转数字,Number.FromText,把文本"20221222"转为数字。
Number.FromText("20221222")
日期转数字1,Number.From,把日期2022/12/22转为数字44917。
Number.From(#date(2022, 12, 22))
日期转数字2,Number.FromText+Date.ToText,把日期2022/12/22转为数字202212。
Number.FromText (Date.ToText((#date(2022, 12, 22),"yyyyMM"))