【问题标题】:Increment date by one in such a way its next working/week day date以这样的方式将日期加一,使其下一个工作日/工作日日期
【发布时间】:2022-01-12 13:06:24
【问题描述】:

我正在使用 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))

下一个工作日应该是下一个工作日而不是周末。怎么办?

【问题讨论】:

  • 星期六是工作日吗?假期呢,在哪个国家/地区?
  • 只有周末,即周六和周日,应该跳到周一。

标签: dataframe scala apache-spark date apache-spark-sql


【解决方案1】:

您可以使用dayofweek 获取工作日的编号,如果当天是星期六,则加 2;如果是星期五,则加 3。

val day = dayofweek(col("some_date"))
val nextworkday = col("some_date") + when(day > 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")))
    

    【讨论】:

      猜你喜欢
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多