Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
databricks python在数据框中获取一周的结束日期_Python_Databricks - Fatal编程技术网

databricks python在数据框中获取一周的结束日期

databricks python在数据框中获取一周的结束日期,python,databricks,Python,Databricks,假设我有以下数据帧 年周 2019 1 2019年2月 我想要第一周和第二周的星期日 年周星期日 2019 1 20190106 2019 2 20190113 如何实现这一点?pyspark.sql.functions有一个非常方便的函数,名为next_day,它完全满足您的需要。它需要一个日期和一个你想要找到的工作日。为该函数创建正确的参考日期可能有点棘手,我喜欢这样: df.withColumn("firstDayOfYear", to_date(concat(col

假设我有以下数据帧 年周 2019 1 2019年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()
我在这里做的是首先创建一年中的第一天,然后在所需的一周中找到相应的一天,然后运行下一天以获得下一个星期天。这种方法有一个问题,即边缘情况,如下所示

+----+----+--------------+---------------+----------+
|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。当我们把它传递到下一天时,我们得到了下一个星期日,在当前的一个星期日之后。要解决此问题,我们可以添加一些附加逻辑:

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 *