【问题标题】:Pyspark convert string type date into dd-mm-yyyy formatPyspark 将字符串类型日期转换为 dd-mm-yyyy 格式
【发布时间】:2020-09-16 19:44:26
【问题描述】:

使用 pyspark 2.4.0

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

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

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

注意dt列中不同类型的日期格式。如果我可以将整个列制作成一种格式只是为了便于转换,那会更容易,但是由于数据框很大,所以不可能遍历每一列并将其更改为一种格式。我还尝试了以下代码,仅针对我将其包括在内的未来读者,针对我尝试循环执行的 2 种日期类型,但没有成功。

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]) 

有什么想法吗?

【问题讨论】:

标签: date pyspark


【解决方案1】:

试试这个-

在 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)):_*))

【讨论】:

    【解决方案2】:

    试试这个应该可以...

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 2016-09-29
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多