pyspark date_format 函数 returns 不正确的年份
pyspark date_format function returns incorrect year
pyspark.sql.functions.date_format - returns 一年中最后一天的年份不正确
Pyspark版本:版本2.3.0.cloudera3
Python 版本:Python 2.7.5
当我尝试使用 pyspark 中的函数 date_format 重新格式化一年的最后一个日期时,它 returns 下一年与 "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')]
"YYYY"(大写)与 "yyyy"(小写)有何不同?
根据 date_format
上的文档:
"All pattern letters of the Java class java.text.SimpleDateFormat can be used"
如果您查看 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|
+----------+----------+----------+
可以看出2022年不错,年末是星期六。如果你尝试更多年,当它们在星期六结束时,你会发现相同的结果。所以我的猜测(不完全确定)是当你使用大写 Y 时,解析会转到下一个星期六并获取与这个星期六相关联的年份。对于 2019 年,因为它是星期二,它跳转到 2020 年 1 月 4 日星期六并得到今年而不是 2019 年。
pyspark.sql.functions.date_format - returns 一年中最后一天的年份不正确
Pyspark版本:版本2.3.0.cloudera3 Python 版本:Python 2.7.5
当我尝试使用 pyspark 中的函数 date_format 重新格式化一年的最后一个日期时,它 returns 下一年与 "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')]
"YYYY"(大写)与 "yyyy"(小写)有何不同?
根据 date_format
上的文档:
"All pattern letters of the Java class java.text.SimpleDateFormat can be used"
如果您查看 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|
+----------+----------+----------+
可以看出2022年不错,年末是星期六。如果你尝试更多年,当它们在星期六结束时,你会发现相同的结果。所以我的猜测(不完全确定)是当你使用大写 Y 时,解析会转到下一个星期六并获取与这个星期六相关联的年份。对于 2019 年,因为它是星期二,它跳转到 2020 年 1 月 4 日星期六并得到今年而不是 2019 年。