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

Posted

技术标签:

【中文标题】Pyspark 将字符串转换为日期时间戳列,包含两种不同的格式【英文标题】:Pyspark Convert String to Date timestamp Column consisting two different formats 【发布时间】:2021-04-18 13:49:05 【问题描述】:

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

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

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

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)

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

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

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

【问题讨论】:

【参考方案1】:

您可以使用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|
+----------------------+----------------+

【讨论】:

以上是关于Pyspark 将字符串转换为日期时间戳列,包含两种不同的格式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PySpark 中将 unix 时间戳列转换为人类可理解的时间戳? [复制]

Pandas 如何将时间戳列转换为日期时间? [复制]

在 PySpark 上将日期时间转换为日期

Pandas 将时间戳列转换为日期时间

使用 PySpark 将日期和时间字符串转换为时间戳时如何保留毫秒?

将纪元时间戳列转换为带有时区的日期时间