如何将所有日期格式转换为日期列的时间戳?
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 怎么能分辨?以上是关于如何将所有日期格式转换为日期列的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章