我有一个 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。
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()