#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|
---------- ---------- ---------- ---------- ---------- ----------