Проверьте и измените форматы дат в pyspark

#date #pyspark #databricks #date-format #date-formatting

Вопрос:

У меня есть столбец дат с разными датами. Теперь я хочу проверить его в определенном формате («ММ-дд-гггг»), и если они не совпадают, необходимо отформатировать дату в нужном формате.

 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'
 

Если это одиночная дата, я мог бы изменить формат, указав этот конкретный формат, но как мне преобразовать другой формат даты в желаемый формат даты? Есть ли какое-либо решение для этого?

Ответ №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|
 ---------- ---------- ---------- ---------- ---------- ----------