Databricks Python 在数据框中获取一周的结束日期



假设我有以下数据框 年周 2019 1 2019年 2

我想得到第 1 周和第 2 周的星期日

年周
星期日 2019 1 20190106 2019 2 20190113

如何实现呢?

>pyspark.sql.functions有一个非常方便的函数,名为next_day,它完全可以做你想要的。它需要一个日期和一个工作日,你想找到。为这个函数创建一个正确的参考日期可能有点棘手,我就是这样做的:

df.withColumn("firstDayOfYear",  to_date(concat(col("year"), lit("-1-1"))))
.withColumn("realtiveWeekDay", expr("date_add(firstDayOfYear, (week - 1) * 7)"))
.withColumn("Sunday", next_day("realtiveWeekDay", "Sun")).show()

我在这里所做的是首先创建一年的第一天,然后在所需的一周中找到相应的日期,然后运行next_day以获得下一个星期日。这种方法有一个问题 - 边缘情况,如下所示。

+----+----+--------------+---------------+----------+
|year|week|firstDayOfYear|realtiveWeekDay|    Sunday|
+----+----+--------------+---------------+----------+
|2019|   1|    2019-01-01|     2019-01-01|2019-01-06|
|2019|   2|    2019-01-01|     2019-01-08|2019-01-13|
|2019|  53|    2019-01-01|     2019-12-31|2020-01-05|
|2018|   1|    2018-01-01|     2018-01-01|2018-01-07|
|2017|   1|    2017-01-01|     2017-01-01|2017-01-08|
|2017|   2|    2017-01-01|     2017-01-08|2017-01-15|
+----+----+--------------+---------------+----------+

在2017年1月1日是星期日 - 所以我知道你想找到的第一周星期日实际上是2017.1.1。当我们把它传递给next_day时,我们会在当前星期天之后的下周日。为了解决这个问题,我们可以添加一些额外的逻辑:

df.withColumn("firstDayOfYear",  to_date(concat(col("year"), lit("-1-1"))))
.withColumn("realtiveWeekDay", expr("date_add(firstDayOfYear, (week - 1) * 7)"))
.withColumn("AdjustedSunday", when(dayofweek("realtiveWeekDay") == 1, col("realtiveWeekDay")).otherwise(next_day("realtiveWeekDay", "Sun")))
.select("year", "week", "AdjustedSunday").show()

这将为您提供正确的结果:


+----+----+--------------+
|year|week|AdjustedSunday|
+----+----+--------------+
|2019|   1|    2019-01-06|
|2019|   2|    2019-01-13|
|2019|  53|    2020-01-05|
|2018|   1|    2018-01-07|
|2017|   1|    2017-01-01|
|2017|   2|    2017-01-08|
+----+----+--------------+

需要注意的一点是,在年底,上周的周日可能是明年。您可能希望以特殊方式处理此情况。

上面的代码假设您从pyspark.sql.functions导入了所有使用的函数,因此您可能需要执行

from pyspark.sql.functions import *

最新更新