在pyspark中的两个时间戳之间创建一个时间戳数组

Posted

技术标签:

【中文标题】在pyspark中的两个时间戳之间创建一个时间戳数组【英文标题】:Creating an array of timestamps between two timestamps in pyspark 【发布时间】:2019-12-04 04:11:11 【问题描述】:

我的 pyspark 数据框中有两个时间戳列。我想创建第三列,其中包含两个时间戳之间的时间戳小时数组。

这是我为此编写的代码..

# Creating udf function
def getBetweenStamps(st_date, dc_date):
    import numpy as np
    hr = 0
    date_list = []
    runnig_date = st_date
    while (dc_date>runnig_date):
        runnig_date = st_date+timedelta(hours=hr)
        date_list.append(runnig_date)
        hr+=1
    dates = np.array(date_list)
    return dates
udf_betweens = F.udf(getBetweenStamps, ArrayType(DateType()))

# Using udf function
orders.withColumn('date_array', udf_betweens(F.col('start_date'), F.col('ICUDischargeDate'))).show()

但是这显示错误

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我认为函数的输入是作为两个数组而不是作为导致错误的两个日期时间进入的。有没有办法解决?有没有其他办法解决这个问题?

非常感谢。

【问题讨论】:

【参考方案1】:

从 udf 返回 numpy 数组时出现错误。您只需返回 date_list 即可。

def getBetweenStamps(st_date, dc_date):
    import numpy as np
    hr = 0
    date_list = []
    runnig_date = st_date
    while (dc_date>runnig_date):
        runnig_date = st_date+timedelta(hours=hr)
        date_list.append(runnig_date)
        hr+=1
    return date_list
udf_betweens = F.udf(getBetweenStamps, ArrayType(DateType()))

测试上述功能:

df = spark.sql("select current_timestamp() as t1").withColumn("t2", col("t1") + expr("INTERVAL 1 DAYS"))
df.withColumn('date_array', udf_betweens(F.col('t1'), F.col('t2'))).show()

【讨论】:

以上是关于在pyspark中的两个时间戳之间创建一个时间戳数组的主要内容,如果未能解决你的问题,请参考以下文章

在两个给定时间戳之间创建时间序列(范围)

在 pyspark sql 中查找两个时间戳之间的差异

Pyspark:两个日期之间的差异(Cast TimestampType,Datediff)

新创建的列在 pyspark 数据框中显示空值

如何计算每天的时间戳条目数

pyspark 的“between”功能:时间戳的范围搜索不包含在内