PySpark-将小时和分钟数据转换为秒

问题描述 投票:0回答:2

我有给定的时间XXh:YYm(例如1h:23m),我试图将其转换为秒。棘手的部分是,如果少于一个小时,则时间将仅为YYm(例如52m)。

我当前正在使用

%pyspark
newColumn = unix_timestamp(col("time"), "H:mm")

dataF.withColumn('time', regexp_replace('time', 'h|m', '')).withColumn("time", newColumn).show()

这非常适合删除h和m字母,然后转换为秒,但是如前所述,当时间少于一个小时时,由于它实际上不是H:mm格式,所以将其抛出null。有什么好的方法呢?我一直在尝试各种似乎使它复杂化的事情,但仍然没有找到解决方案。

我倾向于某种条件类似

if value contains 'h:' then newColumn = unix_timestamp(col("time"), "H:mm")
else  newColumn = unix_timestamp(col("time"), "mm")

但是我对pyspark还是陌生的,不确定如何执行此操作以获取最终输出。我基本上是在寻找一种将时间转换为秒并可以处理'1h:23m'和'53m'格式的方法。

python apache-spark pyspark apache-zeppelin
2个回答
0
投票

这应该可以解决问题,假设时间列是字符串类型。仅在其他情况下用于分隔两个不同的时间(通过包含“ h”)并用于子字符串以获得所需的分钟数时使用。

from pyspark.sql import functions as F
df.withColumn("seconds", F.when(F.col("time").contains("h"), F.unix_timestamp(F.regexp_replace("time", "h|m", ''),"H:mm"))\
.otherwise(F.unix_timestamp(F.substring("time",1,2),"mm")))\
.show()

+------+-------+
|  time|seconds|
+------+-------+
|1h:23m|   4980|
|   23m|   1380|
+------+-------+

0
投票

您可以使用“ unix_timestamp”功能将DateTime转换为以秒为单位的unix时间戳。

您可以在Spark DateTime函数上引用我的博客之一,然后转到“ unix_timestamp”部分。

https://medium.com/expedia-group-tech/deep-dive-into-apache-spark-datetime-functions-b66de737950a

问候,

Neeraj

© www.soinside.com 2019 - 2024. All rights reserved.