Pyspark 将字符串转换为包含两种不同格式的日期时间戳列

Sal*_* Bz 1 apache-spark apache-spark-sql pyspark

我正在处理芝加哥数据集,日期列采用字符串格式,由日期组成,但具有两种不同的格式:

Row(Date='01/10/2008 12:00'),
Row(Date='02/25/2008 08:20:53 PM')
Run Code Online (Sandbox Code Playgroud)

我找到下面的代码并尝试了这两种代码(我不确定是否正确),但是由于它包含两种格式,所以下面的代码都会收到错误,表明找不到该格式。

data_clean = data_clean.withColumn("Date_dt", f.from_unixtime(f.unix_timestamp("Date",'MM/dd/yy hh:mm:ss aa'),'MM/dd/yyyy HH:mm:ss'))
data_clean.withColumn("Date_dt", to_timestamp("Date", "MM/dd/yy HH:mm")).show(1, False)
Run Code Online (Sandbox Code Playgroud)

我还找到了以下解决方案,但我需要一个日期时间格式,包括小时和分钟作为输出:

from pyspark.sql.functions import coalesce, to_date
def to_date_(col, formats=("MM/dd/yyyy", "yyyy-MM-dd")):
    return coalesce(*[to_date(col, f) for f in formats])
Run Code Online (Sandbox Code Playgroud)

您对检查格式并根据它进行转换有何建议?

mck*_*mck 5

您可以使用date_format将解析的日期转换为您想要的格式:

import pyspark.sql.functions as F

df.show(truncate=0)
+----------------------+
|date                  |
+----------------------+
|01/10/2008 12:00      |
|02/25/2008 08:20:53 PM|
+----------------------+

df2 = df.withColumn(
    'date2', 
    F.date_format(
        F.coalesce(
            F.to_timestamp('date', 'MM/dd/yyyy hh:mm:ss a'), 
            F.to_timestamp('date', 'MM/dd/yyyy HH:mm')
        ), 
        'MM/dd/yyyy HH:mm'
    )
)

df2.show(truncate=0)
+----------------------+----------------+
|date                  |date2           |
+----------------------+----------------+
|01/10/2008 12:00      |01/10/2008 12:00|
|02/25/2008 08:20:53 PM|02/25/2008 20:20|
+----------------------+----------------+
Run Code Online (Sandbox Code Playgroud)