【问题标题】:How to convert all the date format to a timestamp for date column?如何将所有日期格式转换为日期列的时间戳?
【发布时间】:2020-12-30 12:54:39
【问题描述】:

我使用的是 PySpark 3.0.1 版。我正在读取一个 csv 文件作为具有 2 个日期列的 PySpark 数据框。但是当我尝试打印模式时,两列都填充为字符串类型。

附上的截图是数据框和数据框的架构。

如何使用 pyspark 将日期列中的行值转换为时间戳格式?

我尝试了很多东西,但所有代码都需要当前格式,但是如果我不知道 csv 文件中的格式是什么,如何转换为正确的时间戳。

我也尝试过下面的代码,但这正在创建一个具有空值的新列

df1 = df.withColumn('datetime', col('joining_date').cast('timestamp'))
print(df1.show())
print(df1.printSchema())

【问题讨论】:

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


    【解决方案1】:

    由于有两种不同的日期类型,您需要使用两种不同的日期格式进行转换,并合并结果。

    import pyspark.sql.functions as F
    
    result = df.withColumn(
        'datetime',
        F.coalesce(
            F.to_timestamp('joining_date', 'MM-dd-yy'),
            F.to_timestamp('joining_date', 'MM/dd/yy')
        )
    )
    
    result.show()
    +------------+-------------------+
    |joining_date|           datetime|
    +------------+-------------------+
    |    01-20-20|2020-01-20 00:00:00|
    |    01/19/20|2020-01-19 00:00:00|
    +------------+-------------------+
    

    如果你想全部转换成单一格式:

    import pyspark.sql.functions as F
    
    result = df.withColumn(
        'datetime',
        F.date_format(
            F.coalesce(
                F.to_timestamp('joining_date', 'MM-dd-yy'),
                F.to_timestamp('joining_date', 'MM/dd/yy')
            ),
            'MM-dd-yy'
        )
    )
    
    result.show()
    +------------+--------+
    |joining_date|datetime|
    +------------+--------+
    |    01-20-20|01-20-20|
    |    01/19/20|01-19-20|
    +------------+--------+
    

    【讨论】:

    • 感谢您的快速回复。但实际上问题是我不知道原始 csv 文件中有不同的格式。
    • @Nayanjain 可以先试试这两种格式,看看能转换多少
    • 其实我已经试过了。它给了我正确的结果。但它是批量数据,要求是处理动态日期格式并将其转换为一种格式
    • @Nayanjain 您需要提供所有日期格式 - 恐怕 Spark 无法猜测您数据的日期格式。
    • @Nayanjain 正如我所说,Spark 无法猜测您的日期格式 - 想象一下如果一行有 '01/01/20' - 是 2020 年 1 月 1 日还是 2001 年 1 月 20 日?连人类都无法分辨,Spark 怎么能分辨?
    猜你喜欢
    • 2016-11-26
    • 2011-03-05
    • 2019-02-25
    • 1970-01-01
    • 2021-11-30
    • 2015-08-19
    • 2020-02-23
    • 1970-01-01
    相关资源
    最近更新 更多