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

Pyspark: Convert String Datetime in 12 hour Clock to Date time with 24 hour clock (Time Zone Change)

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

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")))

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


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

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

如何创建一个采用 "Timestamp (CST)" 的新列并将其更改为 UTC 并将其转换为带有 24 小时制时间戳的日期时间?

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

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

我尝试了以下代码,但返回的所有结果均为空:

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

首先,使用

导入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,你在yyyy-MM-dd'T'hh:mm:ss aa中使用aa来指定PM。

  • 您的输入字符串中有 T,因此您必须按上述格式指定它。

@pyy4917 的回答中提到的 aa 选项可能会产生遗留错误。要修复它,请将 aa 替换为 a

完整代码如下:

df_time_twenfour = df_time.withColumn('Timestamp (CST)', \ ...    
 from_unixtime(unix_timestamp(col(('Timestamp (CST)')), \...
"yyyy-MM-dd'T'hh:mm:ss a"), "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"))