如何将所有日期格式转换为日期列的时间戳?

Posted

技术标签:

【中文标题】如何将所有日期格式转换为日期列的时间戳?【英文标题】: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())

【问题讨论】:

【参考方案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 怎么能分辨?

以上是关于如何将所有日期格式转换为日期列的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

js时间戳怎么转成日期格式

如何在 DataFrame 中将时间戳转换为日期格式?

js页面里时间戳转日期

vue.js怎样将时间戳转化为日期格式

怎么在Oracle中将时间戳转化为日期格式

SQLServer时间戳转日期格式(13位时间戳)