从字符串转换为时间戳时,Pyspark 可以处理多种日期时间格式

DBA*_*642 4 python apache-spark pyspark

我有以下示例数据框:

+------------------+-----------+
|order_completed_at|static_date|
+------------------+-----------+
|6/16/2021 21:29   |2021-10-10 |
|6/7/2021 9:29     |2021-10-10 |
|6/12/2021 15:35   |2021-10-10 |
|6/18/2021 22:25   |2021-10-10 |
|6/16/2021 5:25    |2021-10-10 |
+------------------+-----------+
Run Code Online (Sandbox Code Playgroud)

其中两个字段都是字符串类型。我需要将它们转换为时间戳,我可以使用以下代码来完成:

from pyspark.sql import functions as sql_functions

order_dates = order_dates.withColumn("order_completed_at_test", sql_functions.when() sql_functions.unix_timestamp(
        sql_functions.col('order_completed_at'), "MM/dd/yyyy").cast("timestamp"))

order_dates = order_dates.withColumn("static_date_test", sql_functions.to_timestamp("static_date"))
Run Code Online (Sandbox Code Playgroud)

然而,在order_completed_at列中,可以有多种格式的混合,例如它可以是MM/dd/yyyyyyyy-MM-dd

是否可以编写一个可以解释两种日期时间格式的表达式?

编辑:

我将结束这个问题,因为正如两个答案都指出的那样,处理动态日期格式的这条道路非常滑坡。我将要求客户更改源数据

San*_*394 5

如果您完全确定只有两种格式,那么您可以使用where otherwise.

例子 :

from pyspark.sql.functions import col
from pyspark.sql.functions import when

order_dates.withColumn("datetest", \
    when(col("order_completed_at").rlike("\d+/\d+/\d+"), #YOUR_TIMESTAMP_CAST_OP_FOR_MM/dd/yyyy )\
    .otherwise(#YOUR_TIMESTAMP_CAST_OP_FOR_yyyy-MM-dd))
Run Code Online (Sandbox Code Playgroud)