验证和更改 pyspark 中的日期格式
Validate and change the date formats in pyspark
我有一个具有不同日期格式的日期列。现在我想用特定格式 ('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'
如果是单个日期,我可以通过指定特定格式来更改格式,但如何将不同的日期格式转换为所需的日期格式?有解决办法吗?
您可以在不同的列中尝试不同的时间格式,然后使用 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|
+----------+----------+----------+----------+----------+----------+
我有一个具有不同日期格式的日期列。现在我想用特定格式 ('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'
如果是单个日期,我可以通过指定特定格式来更改格式,但如何将不同的日期格式转换为所需的日期格式?有解决办法吗?
您可以在不同的列中尝试不同的时间格式,然后使用 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|
+----------+----------+----------+----------+----------+----------+