为啥 date_format() 在 Pyspark 中返回错误的一周?

Posted

技术标签:

【中文标题】为啥 date_format() 在 Pyspark 中返回错误的一周?【英文标题】:Why is the date_format() returning wrong week in Pyspark?为什么 date_format() 在 Pyspark 中返回错误的一周? 【发布时间】:2020-08-21 07:05:39 【问题描述】:

是否试图从 pyspark 数据框中的日期列中获取每月的星期几?我正在使用以下示意图来获取星期:date_format(to_date("my_date_col","yyyy-MM-dd") "W") from https://www.datasciencemadesimple.com/get-week-number-from-date-in-pyspark/#:~:text=In%20order%20to%20get%20Week,we%20use%20weekofmonth()%20function.

奇怪的是,这似乎每周都有效,除了 8 月 20 日的第一周!

base.filter(col("acct_cycle_cut_dt").between("2020-08-01","2020-08-07")\
       ).select("acct_cycle_cut_dt",month("acct_cycle_cut_dt"),\
                date_format(to_date("acct_cycle_cut_dt","yyyy-MM-dd"), "W")\
              ).limit(4).show()

+-----------------+------------------------+----------------------------------------------------------+
|acct_cycle_cut_dt|month(acct_cycle_cut_dt)|date_format(to_date(`acct_cycle_cut_dt`, 'yyyy-MM-dd'), W)|
+-----------------+------------------------+----------------------------------------------------------+
|       2020-08-02|                       8|                                                         2|
|       2020-08-07|                       8|                                                         2|
|       2020-08-07|                       8|                                                         2|
|       2020-08-07|                       8|                                                         2|
+-----------------+------------------------+----------------------------------------------------------+

base.filter(col("acct_cycle_cut_dt").between("2020-07-01","2020-07-07")\
       ).select("acct_cycle_cut_dt",month("acct_cycle_cut_dt"),\
                date_format(to_date("acct_cycle_cut_dt","yyyy-MM-dd"), "W")\
              ).limit(4).show()

+-----------------+------------------------+----------------------------------------------------------+
|acct_cycle_cut_dt|month(acct_cycle_cut_dt)|date_format(to_date(`acct_cycle_cut_dt`, 'yyyy-MM-dd'), W)|
+-----------------+------------------------+----------------------------------------------------------+
|       2020-07-03|                       7|                                                         1|
|       2020-07-03|                       7|                                                         1|
|       2020-07-02|                       7|                                                         1|
|       2020-07-02|                       7|                                                         1|
+-----------------+------------------------+----------------------------------------------------------+

【问题讨论】:

您的代码和数据难以阅读,没有'2020-08-01'的结果和执行结果,可重现的数据。 请原谅我的糟糕编辑! 【参考方案1】:

八月,月份从星期六开始。当您的日期为“2020-08-02”或“2020-08-07”时,这两个日期在该月之前只有一个星期日。每当在周末之前或周末开始一个月时,您的脚本总是会返回错误的结果。

【讨论】:

【参考方案2】:

这是正确的结果,没有错。

from pyspark.sql.functions import *

df.withColumn('date', to_timestamp('date', 'yyyy-MM-dd')) \
  .withColumn('month', month('date')) \
  .withColumn('week', date_format('date', 'W')) \
  .show(10, False)

+-------------------+-----+----+
|date               |month|week|
+-------------------+-----+----+
|2020-08-01 00:00:00|8    |1   |
|2020-08-02 00:00:00|8    |2   |
|2020-08-03 00:00:00|8    |2   |
|2020-08-04 00:00:00|8    |2   |
|2020-08-05 00:00:00|8    |2   |
|2020-08-06 00:00:00|8    |2   |
|2020-08-07 00:00:00|8    |2   |
|2020-08-08 00:00:00|8    |2   |
|2020-08-09 00:00:00|8    |3   |
|2020-08-10 00:00:00|8    |3   |
+-------------------+-----+----+

你甚至可以从日历中查看这个,

8 月 1 日实际上是 8 月的第一周,而 Auguet 的 2 日是第二周。

【讨论】:

说得有道理,傻我完全忽略了这一点,非常感谢!

以上是关于为啥 date_format() 在 Pyspark 中返回错误的一周?的主要内容,如果未能解决你的问题,请参考以下文章

DATE_FORMAT索引问题

Laravel Eloquent 如何在 Postgresql 中使用 DATE_FORMAT

如何在 date_format 包中将 24 小时转换为 12 小时 [重复]

DATE_FORMAT()函数实战

MySQL DATE_FORMAT() 函数

DATE_FORMAT(date, format)