为什么date_format在Pyspark中返回错误的星期?

问题描述

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

获取星期:date_format(to_date("my_date_col","yyyy-MM-dd") "W")

奇怪的是,似乎每个星期都可以使用,除了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",W)|
+-----------------+------------------------+----------------------------------------------------------+
|       2020-07-03|                       7|                                                         1|
|       2020-07-03|                       7|                                                         1|
|       2020-07-02|                       7|                                                         1|
|       2020-07-02|                       7|                                                         1|
+-----------------+------------------------+----------------------------------------------------------+

解决方法

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

,

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

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

您甚至可以从日历中进行检查,

enter image description here

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