【问题标题】:pyspark date_format function returns incorrect yearpyspark date_format 函数返回不正确的年份
【发布时间】:2019-06-21 18:49:34
【问题描述】:

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')]

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

【问题讨论】:

    标签: python pyspark date-format


    【解决方案1】:

    根据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|
    +----------+----------+----------+
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多