问题描述
是否要从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 |
+-------------------+-----+----+
您甚至可以从日历中进行检查,
实际上8月1日在8月的第一周,而Auguet 2号在第二周。