在工作中常常会遇到不规范的日期,当需要处理与时间相关的问题(比如,时间的区间匹配)就需要把文本型的日期转化为真正的日期(或者整数型日期),否则就会引发错误,因为Power Query不像Excel或者Power Pivot那样会自动为数据进行转换。以下为数种常见的转换(示例日期为2020年01月31日):
情景一(数字转日期):
let Soluntion = Date.From( Number.ToText( 20200131, "0000-00-00" ) ) in Soluntion
情景二(日期转数字):
let Solution = Int64.From( Date.ToText( #date( 2020, 01, 31 ), "yyyyMMdd" ) ) in Solution
情景三(文本转日期):
let Solution = Date.From( Text.Combine( List.Reverse( Text.Split( "31.01.2020", ".") ), "-" ) ) in Solution
情景四(日期转文本):
= Date.ToText( #date( 2020, 01, 31), "dd.MM.yyyy" )
情景五(文本短日期转日期):
let fnTextToDate = ( DateInText as text, Century as number ) =˃ let SplitByStop = Text.Split( DateInText, "." ), Transform = List.Transform( SplitByStop, each Int64.From( _ ) ), Result = #date( Transform{2} + Century * 100, Transform{1}, Transform{0} ) in Result in fnTextToDate("31.01.20", 20 )
情景六(日期转文本短日期):
= Date.ToText( #date( 2020, 01, 31), "dd.MM.yy" )
文本型的日期需要往“yyyy-mm-dd”的形式转换,因为只有这种形式不会因为计算机的日期制式产生歧义。
情景五中,倒数第三行代码中,20应改为Century.
已经改正,谢谢
文本值借助拆分、重组函数或者Text.Format向"yyyy-MM-dd"转换以便被Date.From精确识别;日期转数值则以文本格式过渡,整体堆砌去除分隔符,or转为日期对应的数字值。
情景三好像不需要那么复杂,用以下即可实现:
Solution =Date.FromText( "31.01.2020" ,[Format="dd.MM.yyyy"])
非常好的思路,谢谢分享