我有一个包含日期数组的列,我想知道提取具有日期之间的间隔(以天为单位)数组的新列的最有效方法。
[01-01-2001, 03-01-2001, 10-01-2001, 25-01-2001]
应该变成:
[01-01-2001, 03-01-2001, 10-01-2001, 25-01-2001]
[2, 7, 15]
我有 UDF 解析数组并逐一减去日期,但我确信有一种最有效的方法来做到这一点。 谢谢!
最佳答案
一种方法是使用 transform功能如下图:
from pyspark.sql.functions import expr
df = spark.createDataFrame([
[["01-01-2001", "03-01-2001", "10-01-2001", "25-01-2001"]]
], ["dates"])
df.withColumn("dates", expr("transform(dates, x -> to_date(x,'dd-MM-yyyy'))"))\
.withColumn("diff", expr("array_remove(transform(dates, (x, i) -> if(i > 0, datediff(dates[i] , dates[i-1]), -1)), -1)"))\
.show(100, False)
# +------------------------------------------------+----------+
# |dates |diff |
# +------------------------------------------------+----------+
# |[01-01-2001, 03-01-2001, 10-01-2001, 25-01-2001]|[2, 7, 15]|
# +------------------------------------------------+----------+
通过第一个转换,我们将字符串项转换为日期。然后,我们迭代每个项目,计算表达式 if(i > 0, datediff(dates[i],dates[i-1]), -1)
。
说明
当 index(i) > 0
使用datediff
获取当前日期与前一个日期之间的差异,该差异返回天数。否则
返回-1。请注意,我们始终需要删除它。我们使用 -1 而不是null
,因为从数组中删除它更容易(请阅读 this 了解更多信息)- 最终使用
array_remove
从数组中删除多余的-1
关于pyspark - 日期数组中的间隔数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73543711/