Pyspark:将12小时制中的字符串日期时间转换为24小时制中的日期时间(时区更改)

时间:2018-12-11 20:35:56

标签: datetime pyspark timestamp clock

编辑:抱歉,示例数据框有些偏离。以下是我尝试转换的更正后的示例数据框:

Timestamp (CST)
12/8/2018 05:23 PM
11/29/2018 10:20 PM

我根据以下建议尝试了以下代码,但返回了空值。

df = df.withColumn('Timestamp (CST)_2', from_unixtime(unix_timestamp(col(('Timestamp (CST)')), "yyyy/MM/dd hh:mm:ss aa"), "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"))

df = df.withColumn("Timestamp (CST)_3", F.to_timestamp(F.col("Timestamp (CST)_2")))

--------------------------------------------------- ---------------------------------


我有一个名为“时间戳(CST)”的字段,它是一个字符串。现在是中部标准时间。

Timestamp (CST)
2018-11-21T5:28:56 PM
2018-11-21T5:29:16 PM

如何创建一个带有“时间戳记(CST)”的新列并将其更改为UTC并将其转换为带有24小时时钟上的时间戳的日期时间?

下面是我想要的表,我希望数据类型是时间戳记:

Timestamp (CST)_2
2018-11-21T17:28:56.000Z
2018-11-21T17:29:16.000Z

我尝试了以下代码,但所有结果都返回null:

df = df.withColumn("Timestamp (CST)_2", to_timestamp("Timestamp (CST)", "yyyy/MM/dd h:mm p"))

1 个答案:

答案 0 :(得分:1)

首先,使用

导入from_unixtimeunix_timestampcol
from pyspark.sql.functions import from_unixtime, unix_timestamp, col

然后,在DataFrame df_time

中重构场景
>>> cols = ['Timestamp (CST)']
>>> vals = [
...         ('2018-11-21T5:28:56 PM',),
...         ('2018-11-21T5:29:16 PM',)]
>>> df_time = spark.createDataFrame(vals, cols)
>>> df_time.show(2, False)
+---------------------+
|Timestamp (CST)      |
+---------------------+
|2018-11-21T5:28:56 PM|
|2018-11-21T5:29:16 PM|
+---------------------+

然后,我的方法是

>>> df_time_twenfour = df_time.withColumn('Timestamp (CST)', \
...             from_unixtime(unix_timestamp(col(('Timestamp (CST)')), "yyyy-MM-dd'T'hh:mm:ss aa"), "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"))
>>> df_time_twenfour.show(2, False)
+------------------------+
|Timestamp (CST)         |
+------------------------+
|2018-11-21T17:28:56.000Z|
|2018-11-21T17:29:16.000Z|
+------------------------+

注释

  • 如果您希望时间采用24小时制,则可以使用HH而不是hh
  • 因为您有一个PM,所以在aa中使用yyyy-MM-dd'T'hh:mm:ss aa来指定PM。

  • 您输入的字符串中包含T,因此,您必须将其指定为上述格式。