Pyspark - 将mmddyy转换为YYYY-MM-DD

问题描述 投票:2回答:2

我正在处理一个大文件,其中有一个mmddyy格式的字段,其字符串为数据类型,我需要将其转换为YYYY-MM-DD。我确实试过创建UDF并转换引用其中一个帖子,但它的抛出错误。示例代码:

数据框中的实际字段:

+-----------+
|DATE_OPENED|
+-----------+
|     072111|
|     090606|

预期产出:

+---------------+
|    DATE_OPENED|
+---------------+
|     2011-07-21|
|     2006-06-09|

示例代码:

func =  udf (lambda x: datetime.strptime(x, '%m%d%Y'), DateType())

newdf = olddf.withColumn('open_dt' ,date_format(func(col('DATE_OPENED')) , 'YYYY-MM-DD'))

错误:

Error : ValueError: time data '072111' does not match format '%m%d%Y'
python datetime apache-spark pyspark pyspark-sql
2个回答
3
投票

我能够在不创建udf的情况下解决它,我确实在堆栈上引用了类似的帖子(pyspark substring and aggregation)并且它完美地工作了。

from pyspark.sql.functions import *
format = 'mmddyy'
col = unix_timestamp(df1['DATE_OPENED'], format).cast('timestamp')
df1 = df1.withColumn("DATE_OPENED", col)

df2 = df.withColumn('open_dt', df['DATE_OPENED'].substr(1, 11))

0
投票

这是可能的,而不依赖于缓慢的UDF。而是通过指定正确的格式使用unix_timestamp解析数据。然后将列转换为DateType,它将为您提供默认情况下所需的格式(yyyy-mm-dd):

df.withColumn('DATE_OPENED', unix_timestamp('DATE_OPENED','mmddyy').cast(DateType()))

如果你有Spark版本2.2+,有一个更方便的方法,to_date

df.withColumn('DATE_OPENEND', to_date('DATE_OPENED','mmddyy'))
© www.soinside.com 2019 - 2024. All rights reserved.