pyspark date_format 函数返回错误的年份

Pra*_*nan 2 python date-format pyspark

pyspark.sql.functions.date_format - 返回一年中最后一天的错误年份

Pyspark版本:版本2.3.0.cloudera3 Python版本:Python 2.7.5

当我尝试使用 pyspark 中的函数 date_format 重新格式化一年中的最后一个日期时,当与“YYYY”而不是“yyyy”一起使用时,它会返回下一年。

>>> from pyspark.sql.functions import *

>>> dftest = spark.createDataFrame([('2017-12-31',)], ['dt'])

>>> dftest.select(date_format('dt', 'MM/dd/yyy').alias('date')).collect()
[Row(date=u'12/31/2017')]
>>> dftest.select(date_format('dt', 'MM/dd/yyyy').alias('date')).collect()
[Row(date=u'12/31/2017')]

>>> dftest.select(date_format('dt', 'MM/dd/YYY').alias('date')).collect()
[Row(date=u'12/31/2018')]
>>> dftest.select(date_format('dt', 'MM/dd/YYYY').alias('date')).collect()
[Row(date=u'12/31/2018')]
Run Code Online (Sandbox Code Playgroud)

“YYYY”(大写)与“yyyy”(小写)有何不同?

Ben*_*n.T 5

根据以下文档date_format

“可以使用 Java 类 java.text.SimpleDateFormat 的所有模式字母”

如果您查看 java 的文档,例如java.text.SimpleDateFormat,您可以看到大写的 Y 指的是星期,而不是小写的 y 本身。

比你的例子中的年数更长:

dftest = spark.createDataFrame([('20{}-12-31'.format(i),) for i in range(19, 25)], ['dt'])
dftest.select('dt', date_format('dt', 'MM/dd/yyyy').alias('date'),
                    date_format('dt', 'MM/dd/YYYY').alias('DATE'),).show()
+----------+----------+----------+
|        dt|      date|      DATE|
+----------+----------+----------+
|2019-12-31|12/31/2019|12/31/2020|
|2020-12-31|12/31/2020|12/31/2021|
|2021-12-31|12/31/2021|12/31/2022|
|2022-12-31|12/31/2022|12/31/2022| # this one is good for both
|2023-12-31|12/31/2023|12/31/2024|
|2024-12-31|12/31/2024|12/31/2025|
+----------+----------+----------+
Run Code Online (Sandbox Code Playgroud)

你可以看到2022年很好,这一年在星期六结束。如果你尝试更多的年份,当它们在星期六结束时你会发现相同的结果。所以我的猜测(不完全确定)是当您使用大写 Y 时,解析将转到下一个星期六并获取与该星期六相关的年份。对于 2019 年,由于今天是星期二,因此会跳转到 2020 年 1 月 4 日星期六,并显示“今年”而不是“2019 年”。