为啥 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 中返回错误的一周?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent 如何在 Postgresql 中使用 DATE_FORMAT