【问题标题】:Validate and change the date formats in pyspark验证和更改 pyspark 中的日期格式
【发布时间】:2021-09-06 18:03:05
【问题描述】:

我有一个包含不同日期格式的日期列。现在我想用特定格式('MM-dd-yyyy')验证它,并且不匹配的日期必须格式化为所需的格式。

df = sc.parallelize([['12-21-2006'],
                     ['05/30/2007'],
                     ['01-01-1984'],
                     ['22-12-2017'],
                     ['12222019']]).toDF(["Date"])
df.show()
+----------+
|      Date|
+----------+
|12-21-2006|
|05/30/2007|
|01-01-1984|
|22-12-2017|
|  12222019|
+----------+

现在验证,

correct=df.filter(~F.col("Date").isNotNull()|
                                           to_date(F.col("Date"),'MM-dd-yyyy').isNotNull())
correct.show()

+----------+
|      Date|
+----------+
|12-21-2006|
|01-01-1984|
+----------+

现在,我提取的错误记录如下:-

wrong = df.exceptAll(correct)
wrong.show()

+----------+
|      Date|
+----------+
|05/30/2007|
|  12222019|
|22-12-2017|
+----------+

现在必须将这些错误记录格式化为所需的格式,即

'MM-dd-yyyy'

如果它是单一的,我可以通过指定特定格式来更改格式,但是如何将不同的日期格式转换为所需的日期格式?有什么解决办法吗?

【问题讨论】:

    标签: date pyspark databricks date-format date-formatting


    【解决方案1】:

    您可以在不同的列中尝试不同的时间格式,然后使用coalesce 获取第一个非空值:

    df.withColumn("d1", F.to_date(F.col("Date"),'MM-dd-yyyy')) \
      .withColumn("d2", F.to_date(F.col("Date"),'MM/dd/yyyy')) \
      .withColumn("d3", F.to_date(F.col("Date"),'dd-MM-yyyy')) \
      .withColumn("d4", F.to_date(F.col("Date"),'MMddyyyy')) \
      .withColumn("result", F.coalesce("d1", "d2", "d3", "d4")) \
      .show()
    

    输出:

    +----------+----------+----------+----------+----------+----------+
    |      Date|        d1|        d2|        d3|        d4|    result|
    +----------+----------+----------+----------+----------+----------+
    |12-21-2006|2006-12-21|      null|      null|      null|2006-12-21|
    |05/30/2007|      null|2007-05-30|      null|      null|2007-05-30|
    |01-01-1984|1984-01-01|      null|1984-01-01|      null|1984-01-01|
    |22-12-2017|      null|      null|2017-12-22|      null|2017-12-22|
    |  12222019|      null|      null|      null|2019-12-22|2019-12-22|
    +----------+----------+----------+----------+----------+----------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多