Pyspark将字符串类型的日期转换为dd-mm-yyyy格式

时间:2020-07-05 03:38:45

标签: date pyspark

使用pyspark 2.4.0

我在日期框架中有日期列,如下所示:

date column in the dataframe

我需要将其转换为DD-MM-YYYY格式。我尝试了包括以下代码在内的一些解决方案,但它返回了空值,

df_students_2 = df_students.withColumn(
            'new_date',
                F.to_date(
                    F.unix_timestamp('dt', '%B %d, %Y').cast('timestamp')))

pic2

请注意,dt列中的日期类型不同。如果我可以将整个列仅以一种格式进行转换就更容易了,但是由于数据帧很大,因此无法遍历每一列并将其更改为一种格式。我还尝试了以下代码,仅针对将来的读者(包括我),针对我试图循环经过的两种日期类型,但均未成功。

def to_date_(col, formats=(datetime.strptime(col,"%B %d, %Y"), \
                           datetime.strptime(col,"%d %B %Y"), "null")):
    
    return F.coalesce(*[F.to_date(col, f) for f in formats]) 

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

试试这个-

在scala中实现,但只需很少的更改即可完成pyspark

// I've put the example formats, but just replace this list with expected formats in the dt column
val dt_formats= Seq("dd-MMM-yyyy", "MMM-dd-yyyy", "yyyy-MM-dd","MM/dd/yy","dd-MM-yy","dd-MM-yyyy","yyyy/MM/dd","dd/MM/yyyy")

val newDF =  df_students.withColumn("new_date", coalesce(dt_formats.map(fmt => to_date($"dt", fmt)):_*))

答案 1 :(得分:0)

尝试一下应该可以...

from pyspark.sql.functions import to_date 
df = spark.createDataFrame([("Mar 25, 1991",), ("May 1, 2020",)],['date_str'])
df.select(to_date(df.date_str, 'MMM d, yyyy').alias('dt')).collect()

[Row(dt=datetime.date(1991, 3, 25)), Row(dt=datetime.date(2020, 5, 1))]

另请参阅-Datetime Patterns for Formatting and Parsing