【问题标题】:Pyspark - Convert mmddyy to YYYY-MM-DDPyspark - 将 mmddyy 转换为 YYYY-MM-DD
【发布时间】:2017-12-13 20:05:39
【问题描述】:

我正在处理一个大文件,该文件具有 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'

【问题讨论】:

  • 查看我的更新答案。它使用更标准的方法来解决问题,而不依赖于 UDF。

标签: python datetime apache-spark pyspark pyspark-sql


【解决方案1】:

我能够在不创建 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))

【讨论】:

【解决方案2】:

这可以在不依赖缓慢的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'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多