1
在日常工作中,大家会用到各种月份的表达方式,比如英文简写、英文全称、中文和数字等,如下图所示:
但是,我们更多的时候,不是对月份本身的单独使用,月份从日期而来,而有用到日期的地方,都应先考虑规范日期的格式,然后再按需要进行转换成想要显示的方式。
所以,从标准格式到其他格式的转换,会更加常见,无论是Excel、Power Query、Power Pivot,乃至其它各种编程软件、工具,通常也会对日期转换有相应的函数直接支持,而特殊格式之间的转换,也往往可以通过先转为规范的能识别的日期入手解决。
2
中英文月份和数字格式之间的转换问题,通常是因为显示形式的需要,所以,最常用的情况,其实是数字形式转为中文或英文,如图中的1和2,而这个,在PQ里的处理也最简单。
最少见的需求应该说是从中文月份到数字的转换了,即上图中的4,因为你要在Excel或任何其他数据源里输入一个中文的日期,如“二〇二一年四月七日”,其实是比较难的!
当然,单纯从月份转换来说,这个转换需求也是有可能存在的。
3
前面我们讲过,各种格式之间的转换,可以通过先转为规范能识别的日期入手,所以,对于月份的转换,除上面提到的第4种特殊情况外,都可以先考虑给月份随便在前面加上年、后面加上日,构造成一个PQ能识别的日期:
1、英文月份转日期
代码语言:javascript复制= Date.From("2021 " & [英文月份_完整] & " 1")
该方法对英文简称也适用:
代码语言:javascript复制= Date.From("2021 " & [英文月份] & " 1")
2、数字转日期
代码语言:javascript复制= Date.From("2021-"&Text.From([数字月份])&"-1")
数字转日期的原理也一样,但要注意的是,数字要先转为文本(Text.From),否则跟文本连接的时候会出错!
4
有了这个日期之后,数字转中文、英文,以及英文转数字,其实都很简单了,直接1个函数就搞定了:
1、数字转中文
代码语言:javascript复制= Date.MonthName([月份转日期])
但是,对于这个简单的写法,你有没有想过:为什么出来的月份名称是中文,而不是英文?
其实,这只是因为咱们的系统区域(语言)设置为中文了!所以,这里面其实有个陷阱:如果你的系统语言改成了英文,那得到的结果就变了!
所以,这里更加严谨的写法是加上第二个参数(这个参数的写法是怎么知道?后面我们再补充说):
代码语言:javascript复制= Date.MonthName([月份转日期],"zh-CN")
2、数字转英文
代码语言:javascript复制= Date.MonthName([月份转日期],"en-US")
3、英文转数字
代码语言:javascript复制= Date.Month([英文转日期])
4、中文转数字
因为中文月份没办法转为日期,所以,要转换的话,我们可以通过预设列表的方式来实现,也就是找到这个列表的位置即可(记得加1哦):
代码语言:javascript复制= List.PositionOf(
{"一","二","三","四","五","六","七","八","九","十","十一","十二"},
Text.Remove([中文月份],{"月"})
) 1
5
前面我们在用Date.MonthName函数的时候,用到第二个参数,写了“zh-CN”和“en-US”,但:
- 为什么这两个文本是这么写的?
- 难道都得靠记住吗?
- 还有其它国家或语言表示形式怎么吧?
其实,我们不需要记,知道从哪里找就行。我们可以随便找一列,右键-更改类型-使用区域设置:
然后选择需要的“区域”:
查看生成的公式就能找到对应的写法了:
6
关于日期格式、区域语言转换的问题,说起来,很多泪!
从上面我们也可以看到,凭什么英文的月份单词,就可以直接加上年和日被系统识别,而中文的月份就不可以?