【问题标题】:Calculate Days Since Last Event Pyspark计算自上次事件以来的天数 Pyspark
【发布时间】:2022-02-17 21:56:37
【问题描述】:

这个问题之前已经为 R 回答过。我想这样做,但使用 pyspark。

制作最新事件的索引

last_event_index <- cumsum(df$event) + 1

右移一位

last_event_index <- c(1, last_event_index[1:length(last_event_index) - 1])

获取事件的日期并使用last_event_index 索引向量, #添加一个NA作为第一个日期,因为没有事件

last_event_date <- c(as.Date(NA), df[which(df$event==1), "date"])[last_event_index]

#用最后一个事件的日期减去事件的日期

df$tae <- df$date - last_event_date
df

|        date |event |     tae|
|-------------|------|-------|
|#1 2000-07-06|     0|  NA days
|#2 2000-09-15|     0|  NA days
|#3 2000-10-15|     1|  NA days
|#4 2001-01-03|     0|  80 days
|#5 2001-03-17|     1| 153 days
|#6 2001-05-23|     1|  67 days
|#7 2001-08-26|     0|  95 days

【问题讨论】:

    标签: python apache-spark date pyspark apache-spark-sql


    【解决方案1】:

    使用 Window last 函数获取上一个事件日期,然后使用 datediff 获取当前行日期:

    from pyspark.sql import functions as F, Window
    
    w = Window.orderBy("date").rowsBetween(Window.unboundedPreceding, -1)
    
    result = df.withColumn(
        "last_event_date",
        F.last(F.when(F.col("event") == 1, F.col("date")), ignorenulls=True).over(w)
    ).withColumn(
        "tae",
        F.concat(
            F.coalesce(F.datediff("date", "last_event_date"), F.lit("NA")),
            F.lit(" days")
        )
    ).drop("last_event_date")
    
    result.show()
    #+----------+-----+--------+
    #|      date|event|     tae|
    #+----------+-----+--------+
    #|2000-07-06|    0| NA days|
    #|2000-09-15|    0| NA days|
    #|2000-10-15|    1| NA days|
    #|2001-01-03|    0| 80 days|
    #|2001-03-17|    1|153 days|
    #|2001-05-23|    1| 67 days|
    #|2001-08-26|    0| 95 days|
    #+----------+-----+--------+
    

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 2019-08-16
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多