我有以下示例数据帧:
+------------------+-----------+
|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/yyyy或yyyy-MM-dd
是否有可能编写一个可以解释两种日期时间格式的表达式?
编辑:
我将结束这个问题,因为处理动态日期格式是一条非常困难的道路,正如两个答案所指出的那样。我将要求客户端对源数据进行更改
发布于 2021-07-09 02:35:58
如果您完全确定只有两种格式,那么您可以使用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))发布于 2021-07-08 23:02:45
这看起来像是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日期的混合)在这方面可能是可以的。一如既往,最好是谨慎行事。
https://stackoverflow.com/questions/68303786
复制相似问题