首页 > 解决方案 > Pyspark:日期时间列中的不匹配值

问题描述

我的 pyspark 列中大多数(字符串)日期的格式如下所示:Thu Jul 01 15:32:02 +0000 2021

我想将它转换成这样的日期格式:01-07-2021 我找到了一种可行的方法,不幸的是,只有当列是干净的,也就是当字符串具有以下格式时:'%a %b %d % H:%M:%S +0000 %Y'

这是我使用的代码:

from datetime import datetime
import pytz
from pyspark.sql.functions import udf, to_date, to_utc_timestamp

# Converting date string format
def getDate(x):
    if x is not None:
        return str(datetime.strptime(x,'%a %b %d %H:%M:%S +0000 %Y').replace(tzinfo=pytz.UTC).strftime("%Y-%m-%d %H:%M:%S"))
    else:
        return None

# UDF declaration
date_fn = udf(getDate, StringType())

# Converting datatype in spark dataframe
df = df.withColumn("date", to_utc_timestamp(date_fn("date"),"UTC"))

有什么方法可以添加一些检测不匹配格式的代码,然后删除观察或将其变为空?

谢谢!

标签: pythonapache-sparkpyspark

解决方案


使用to_date将字符串转换为使用给定格式的日期。如果字符串与格式不匹配,则结果将为null.

有一个小限制to_date无法解析星期几:

'E'、'F'、'q' 和'Q' 符号只能用于日期时间格式,例如date_format。它们不允许用于日期时间解析,例如 to_timestamp。

最简单的方法是在使用之前从日期字符串中删除前三个字符to_date

data = [["Thu Jul 01 15:32:02 +0000 2021"],
  ["Thu Jul 01 15:32:02 +0200 2021"],
  ["Thu Jul 01 15:32:02 2021"], 
  ["2021-07-01 15:32:02"], 
  ["this is not a valid time"]]

df = spark.createDataFrame(data, schema=["input"])

df.withColumn("date", F.to_date(F.substring("input",5,100),
  "MMM dd HH:mm:ss xx yyyy")).show(truncate=False)

输出:


data = [["Thu Jul 01 15:32:02 +0000 2021"],...
+------------------------------+----------+
|input                         |date      |
+------------------------------+----------+
|Thu Jul 01 15:32:02 +0000 2021|2021-07-01|
|Thu Jul 01 15:32:02 +0200 2021|2021-07-01|
|Thu Jul 01 15:32:02 2021      |null      |
|2021-07-01 15:32:02           |null      |
|this is not a valid time      |null      |
+------------------------------+----------+

推荐阅读