如何根据pysparkDataframe中的条件转换日期格式?

yeotifhr  于 2021-05-16  发布在  Spark
关注(0)|答案(1)|浏览(467)

我的Dataframe以字符串格式显示日期,如下所示:

day_date
8/28/2020
9/21/2019
11/21/2020
12/12/2019

我想将此列的格式设置为,如果它与模式2020-11-25 04:02:08匹配,那么它的格式应该是yyyy-mm-dd(2020-11-25),如果它在11/25/2020 02:04:08,那么它的格式应该是mm/dd/yyyy(11/25/2020)
我一直在使用的代码是:

new_df = df.withColumn("new_date", when (df['day_date'].rlike('\d{1,2}/\d{1,2}/\d{4}\s*[\d:]*'),date_format('day_date','mm/dd/yyyy')) \
.when (df['day_date'].rlike('\d{4}-\d{1,2}-\d{1,2}\s*[\d:]*'),date_format('day_date','yyyy-mm-dd')) \
.otherwise(lit(None)))

但在执行时,只获取null。
有没有其他方法可以达到这个目的?
注:数据可能包含时间信息,也可能不包含时间信息。

bpzcxfmw

bpzcxfmw1#

new_df = df.withColumn("new_date",
    F.when(
        F.to_timestamp('day_date','MM/dd/yyyy HH:mm:ss').isNotNull(), 
        F.date_format(
            F.to_timestamp('day_date','MM/dd/yyyy HH:mm:ss'),
            'MM/dd/yyyy'
        )
    ).when(
        F.to_timestamp('day_date','yyyy-MM-dd HH:mm:ss').isNotNull(), 
        F.date_format(
            F.to_timestamp('day_date','yyyy-MM-dd HH:mm:ss'),
            'yyyy-MM-dd'
        )
    ).when(
        (F.to_date('day_date','yyyy-MM-dd').isNotNull() |
         F.to_date('day_date','MM/dd/yyyy').isNotNull()), 
        F.col('day_date')
    )
)

# Example data:

+-------------------+----------+
|           day_date|  new_date|
+-------------------+----------+
|2020-11-25 04:02:08|2020-11-25|
|11/25/2020 02:04:08|11/25/2020|
|         11/21/2020|11/21/2020|
+-------------------+----------+

相关问题