PySpark - 将小时和分钟数据转换为秒
PySpark - converting hour and minute data to seconds
我有一个 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 格式。对此有什么好方法?我一直在尝试不同的事情,这些事情似乎使它变得过于复杂,但我仍然没有找到解决方案。
我倾向于某种条件,例如
if value contains 'h:' then newColumn = unix_timestamp(col("time"), "H:mm")
else newColumn = unix_timestamp(col("time"), "mm")
但我对 pyspark 还很陌生,不确定如何执行此操作以获得最终输出。我基本上是在寻找一种将时间转换为秒并且可以处理“1h:23m”和“53m”格式的方法。
这应该可以解决问题,假设时间列是字符串类型。只是在其他情况下用于分隔两个不同的时间(通过包含 '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|
+------+-------+
您可以使用“unix_timestamp”函数将 DateTime 转换为以秒为单位的 unix 时间戳。
您可以参考我的一篇关于 Spark DateTime 函数的博客,然后转到“unix_timestamp”部分。
https://medium.com/expedia-group-tech/deep-dive-into-apache-spark-datetime-functions-b66de737950a
此致,
尼拉吉
我有一个 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 格式。对此有什么好方法?我一直在尝试不同的事情,这些事情似乎使它变得过于复杂,但我仍然没有找到解决方案。
我倾向于某种条件,例如
if value contains 'h:' then newColumn = unix_timestamp(col("time"), "H:mm")
else newColumn = unix_timestamp(col("time"), "mm")
但我对 pyspark 还很陌生,不确定如何执行此操作以获得最终输出。我基本上是在寻找一种将时间转换为秒并且可以处理“1h:23m”和“53m”格式的方法。
这应该可以解决问题,假设时间列是字符串类型。只是在其他情况下用于分隔两个不同的时间(通过包含 '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|
+------+-------+
您可以使用“unix_timestamp”函数将 DateTime 转换为以秒为单位的 unix 时间戳。
您可以参考我的一篇关于 Spark DateTime 函数的博客,然后转到“unix_timestamp”部分。
https://medium.com/expedia-group-tech/deep-dive-into-apache-spark-datetime-functions-b66de737950a
此致,
尼拉吉