Увеличьте дату на единицу таким образом, чтобы она соответствовала дате следующего рабочего дня/дня недели

#dataframe #scala #apache-spark #date #apache-spark-sql

#фрейм данных #scala #apache-искра #Дата #apache-spark-sql

Вопрос:

Я использую фреймы данных Spark. У меня есть вариант использования, когда мне нужно увеличить дату на единицу. Если добавочная дата приходится на выходные, то мне нужно увеличить ее до следующей недели/рабочего дня.

 val df = Seq(  ("50312", "2021-12-01", "0.9992019"),  ("50312", "2021-12-02", "0.20171201"),  ("50312", "2021-12-03", "2.9992019") ).toDF("id","some_date","item_value") .withColumn("nextworking_day", date_add(col("some_date"),1))  

Следующий рабочий день должен быть в следующий будний день, а не в выходные. Как это сделать?

Комментарии:

1. Суббота-рабочий день? А как насчет праздников, в какой стране?

2. Только в выходные , то есть в субботу и воскресенье , он должен перейти на понедельник.

Ответ №1:

Вы можете использовать dayofweek , чтобы получить номер дня недели и добавить 2, если день-суббота, или добавить 3, если день-пятница.

 val day = dayofweek(col("some_date")) val nextworkday = col("some_date")   when(day gt; 5, -day   9).otherwise(1) val df = Seq(  ("50312", "2021-12-01", "0.9992019"),  ("50312", "2021-12-02", "0.20171201"),  ("50312", "2021-12-03", "2.9992019") ).toDF("id","some_date","item_value") .withColumn("some_date", col("some_date").cast("date")) .withColumn("nextworking_day", nextworkday)  df.show()  ----- ---------- ---------- ---------------  | id| some_date|item_value|nextworking_day|  ----- ---------- ---------- ---------------  |50312|2021-12-01| 0.9992019| 2021-12-02| |50312|2021-12-02|0.20171201| 2021-12-03| |50312|2021-12-03| 2.9992019| 2021-12-06|  ----- ---------- ---------- ---------------   

Ответ №2:

Написание udf для проверки дня должно решить проблему Ниже приведен пример кода, запущенного в pyspark, не содержит кода для праздников, но вы можете создать список или перечисление и добавить условие в зависимости от вашего региона

 import pyspark.sql.functions as f from pyspark.sql.types import TimestampType from datetime import datetime, timedelta   @f.udf(returnType=TimestampType()) def get_convert_date_udf(date_column):  datetime_object = datetime.strptime(date_column, "%Y-%m-%d")  new_datetime_object = datetime_object   timedelta(days=1)  day = new_datetime_object.strftime("%A")  if day == "Sunday":  new_datetime_object  = timedelta(days=1)  elif day == "Saturday":  new_datetime_object  = timedelta(days=2)  return new_datetime_object   df = df.withColumn("next_working_date",  get_convert_date_udf(f.col("some_date")))