【问题标题】: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'的结果和执行结果,可重现的数据。
  • 请原谅我的糟糕编辑!

标签: date debugging pyspark week-number


【解决方案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 日是第二周。

    【讨论】:

    • 说得有道理,傻我完全忽略了这一点,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多