python - 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 *
推荐阅读
- javascript - 如何将 tsx 文件转换为 React 的 js 文件
- php - How do I install php-curl in CentOS 8?
- java - Servlet [example] in web application [/SpringMvcDemo] threw load() exception java.lang.ClassNotFoundException:
- arrays - 如何将numpy数组四舍五入为1dp
- c# - 从控制器发送消息以在 asp.net core mvc 中查看的最佳方式
- mongodb - MongoDB Atlas 连接问题
- api - 雅虎财务 cookie 无效
- django - Django rest框架中的嵌套对象
- javascript - Vanilla JavaScript 无法使用 set src 添加图像(图像未加载)
- python - TypeError:字段“id”需要一个数字,但得到了