Pyspark -如何在pyspark中转换格式为/Date(1593786688000+0200)/的日期/时间戳?

8xiog9wr  于 2023-01-29  发布在  Spark
关注(0)|答案(1)|浏览(158)

我有一个包含CreateDate列的 Dataframe ,格式如下:

CreateDate
/Date(1593786688000+0200)/
/Date(1446032157000+0100)/
/Date(1533904635000+0200)/
/Date(1447839805000+0100)/
/Date(1589451249000+0200)/

我想把这个格式转换成日期/时间戳,所以例外的输出是:

CreateDate
2020-07-03 14:31:28 +02:00
2015-10-28 11:35:57 +01:00
2018-08-10 12:37:15 +02:00
2015-11-18 09:43:25 +01:00
2020-05-14 10:14:09 +02:00

我在SQL中有这样一个查询,它给出了所需的输出,可以帮助开发:

cast(convert(VARCHAR(30), DATEADD(Second, convert(BIGINT, left(replace(replace(CreateDate, '/date(', ''), ')/', ''), 13)) / 1000, '1970-01-01 00:00:00'), 20) + ' ' + '+' + left(right(replace(replace(CreateDate, '/date(', ''), ')/', ''), 4), 2) + ':' + right(replace(replace(CreateDate, '/date(', ''), ')/', ''), 2) AS DATETIMEOFFSET(0)) AS CreateDate

有谁能帮我实现这个目标吗?
谢谢大家!

eblbsuwk

eblbsuwk1#

使用regexp_extract提取时间戳和时间偏移。
然后from_unixtime将秒数转换为时间戳,注意from_unixtime需要秒数,而时间戳的单位是毫秒,这就是为什么我们省略了000(天真地假设在数据中,所有记录中的值都是零,否则需要稍微调整一下)。

val re = """/Date\((\d+)000(\+\d+)"""

df.withColumn("ts", from_unixtime(regexp_extract($"CreateDate", re, 1)))
  .withColumn("tz_offset", regexp_extract($"CreateDate", re, 2))
  .show(false)
+--------------------------+-------------------+---------+
|CreateDate                |ts                 |tz_offset|
+--------------------------+-------------------+---------+
|/Date(1593786688000+0200)/|2020-07-03 16:31:28|+0200    |
+--------------------------+-------------------+---------+

相关问题