【问题标题】:Pyspark handle multiple datetime formats when casting from string to timestamp从字符串转换为时间戳时,Pyspark 处理多种日期时间格式
【发布时间】:2021-07-09 02:43:04
【问题描述】:

我有以下示例数据框:

+------------------+-----------+
|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 |
+------------------+-----------+

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

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"))

但是,在order_completed_at 列中,可以有多种格式,例如MM/dd/yyyyyyyy-MM-dd

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

编辑:

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

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    如果您完全确定只有 2 种格式,那么您可以使用 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))
    

    【讨论】:

      【解决方案2】:

      这看起来像是 Python dateparser 模块周围的 udf(例如 https://spark.apache.org/docs/2.4.6/api/python/_modules/pyspark/sql/udf.html)函数包装器的候选者。

      基本上,您希望能够按照以下方式应用函数调用:

      dateparser.parse("order_completed_at")
      

      作为 sql 的一部分:

      但是 - 虽然这会覆盖您的所有日期,但 不保证 d/m/y 日期不会被误解为 m/d/y 日期,反之亦然。混合日期格式是有问题的,因为它们本质上是模棱两可的。理想情况下,您会解析是否只有一种解释,但将任何可以以多种方式之一解释的都标记为有问题。

      所呈现的问题(y-m-d 和 m/d/y 日期的混合)在这方面可能没问题。一如既往,最好谨慎。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 2016-11-26
        • 2014-08-10
        相关资源
        最近更新 更多