无法在 Pyspark 中解析带有可选日期部分的日期

问题描述 投票:0回答:1

我有一个 Pyspark 数据框,其中的字符串日期可能是 yyyyMM(例如 200802)或 yyyyMMdd(例如 20080917)。我正在尝试将这些解析为日期。我目前正在考虑的功能是

to_date
。查看日期时间解析模式文档,我应该能够使用方括号中的可选部分。但是,我无法让它发挥作用。具有 yyyy-MM 或 yyyy-MM-dd 模式的日期可以使用可选部分。

from pyspark.sql import functions as F

df = spark.createDataFrame([('200802', '2008-02', ), ('20080917', '2008-09-17', )], ['t', 't2'])
display(df
        .withColumn('fdate', F.to_date(F.col('t'), 'yyyyMM[dd]'))
        .withColumn('fdate2', F.to_date(F.col('t2'), 'yyyy-MM[-dd]'))
)

输出为:

t t2 f日期 fdate2
200802 2008年02月 2008-02-01 2008-02-01
20080917 2008-09-17 2008-09-17

您可以看到带有破折号的模式可以正确解析两种日期格式,但严格的数字模式则不能。我是否错误地使用了这个功能?有没有一种方法可以在不使用 UDF 的情况下解析这些日期?

我在 Databricks 运行时 14.2 中使用 Spark 3.5.0。

python datetime pyspark apache-spark-sql
1个回答
0
投票
from pyspark.sql import functions as F
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("dateParsing").getOrCreate()

df = spark.createDataFrame([('200802',), ('20080917',)], ['date_str'])

# Conditionally parse the date based on the string length
df_parsed = df.withColumn(
    'parsed_date',
    F.when(F.length('date_str') == 6, F.to_date('date_str', 'yyyyMM'))
    .otherwise(F.to_date('date_str', 'yyyyMMdd'))
)

df_parsed.show()

© www.soinside.com 2019 - 2024. All rights reserved.