【问题标题】:How to convert string date to desired date format in pyspark如何在pyspark中将字符串日期转换为所需的日期格式
【发布时间】:2021-09-07 16:47:18
【问题描述】:

我有一个日期列,其中一些记录有mm-dd-yy, dd-mm-yy, yy-mm-dd

df = sc.parallelize([['12-21-2021'],
                     ['04-23-2021'],
                     ['22-03-24'],
                     ['12/03/20']]).toDF(["Date"])

df.show()
+----------+
|      Date|
+----------+
|12-21-2021|
|04-23-2021|
|  22-03-24|
|  12/03/20|
+----------+

现在我想将字符串转换为日期格式。但是您可以看到最后两条记录的结果虽然格式正确,但结果列的格式错误。如何让它采用正确的格式?

 from pyspark.sql import functions as F
    from pyspark.sql.functions import col, unix_timestamp, to_date
    from pyspark.sql.functions import date_format
    spark.sql("set spark.sql.legacy.timeParserPolicy=LEGACY")
    sdf = df.withColumn("yyyy/MM/dd", F.to_date(F.unix_timestamp(df.Date,'yyyy/MM/dd').cast('timestamp'))) \
      .withColumn("yyyy-MM-dd", F.to_date(F.unix_timestamp(df.Date,'yyyy-MM-dd').cast('timestamp'))) \
      .withColumn("MM/dd/yyyy", F.to_date(F.unix_timestamp(df.Date,'MM/dd/yyyy').cast('timestamp'))) \
      .withColumn("MM-dd-yyyy", F.to_date(F.unix_timestamp(df.Date,'MM-dd-yyyy').cast('timestamp'))) \
      .withColumn("dd/MM/yy", F.to_date(F.unix_timestamp(df.Date,'dd/MM/yy').cast('timestamp'))) \
      .withColumn("dd-MM-yy", F.to_date(F.unix_timestamp(df.Date,'dd-MM-yy').cast('timestamp'))) \
      .withColumn("result", F.coalesce("yyyy/MM/dd", "yyyy-MM-dd", "MM/dd/yyyy", "MM-dd-yyyy",'dd/MM/yy','dd-MM-yy')) 
    display(sdf)

Date      yyyy/MM/dd    yyyy-MM-dd  MM/dd/yyyy  MM-dd-yyyy  dd/MM/yy    dd-MM-yy     result
12-21-2021  null          null        null      2021-12-21   null        null        2021-12-21
04-23-2021  null          null        null      2021-04-23   null        null        2021-04-23
22-03-24    null        0022-03-24    null       null        null     2024-03-22     0022-03-24
12/03/20    0012-03-20    null     0020-12-03    null      2020-03-12    null        0012-03-20

【问题讨论】:

  • .withColumn("result", F.coalesce("yyyy/MM/dd", "yyyy-MM-dd", "MM/dd/yyyy", "MM-dd-yyyy",'dd/MM/yy','dd-MM-yy')) 更改为.withColumn("result", F.coalesce('dd/MM/yy','dd-MM-yy',"yyyy/MM/dd", "yyyy-MM-dd", "MM/dd/yyyy", "MM-dd-yyyy"))
  • @User12345 我试过用coalsece它没用

标签: date pyspark apache-spark-sql date-format


【解决方案1】:

我测试了一个适合我的解决方案,希望它对你有用。
一些要点:用 '-' 替换 '/' 将允许只有 2 种不同的情况;但仍然会有模棱两可的值,因此您需要为合并选择一个顺序(我看不出有什么方法可以确定日期的格式是 dd/MM 还是带有一些数字的 MM/dd)。我想知道您的问题是否来自您使用cast()
我让中间格式让您查看具体结果,但合并在我的情况下有效。

from pyspark.sql import functions as F, types as T

def TEST_convert_dates(ds_with_dates):
    spark.sql("set spark.sql.legacy.timeParserPolicy=LEGACY")
    df = ds_with_dates\
        .withColumn('Date', F.regexp_replace('Date', '/', '-')) \
        .withColumn('Date_format1', F.to_date(F.col('Date'), 'MM-dd-yy').cast(T.DateType())) \
        .withColumn('Date_format2', F.to_date(F.col('Date'), 'dd-MM-yy').cast(T.DateType())) \
        .withColumn('Date_formated', F.coalesce(
            F.to_date(F.col('Date'), 'MM-dd-yy').cast(T.DateType()),
            F.to_date(F.col('Date'), 'dd-MM-yy').cast(T.DateType())
        ))
    return df

结果如下:

Date           format 1       format 2         Result  
12-21-2021     2021-12-21        null        2021-12-21  
04-23-2021     2021-04-23        null        2021-04-23  
22-03-24         null        2024-03-22      2024-03-22  
12/03/20       2020-12-03    2020-03-12      2020-12-03  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 2020-04-08
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多