首页 > 解决方案 > 如何将所有日期格式转换为日期列的时间戳?

问题描述

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

在此处输入图像描述

在此处输入图像描述

上面附加的屏幕截图是 Dataframe 和 Dataframe 的架构。

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

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

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

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

在此处输入图像描述

标签: apache-sparkdatetimepysparkapache-spark-sql

解决方案


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

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|
+------------+--------+

推荐阅读