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_unixtime
、unix_timestamp
和col
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'"))
编辑:抱歉,示例数据框有点偏离。下面是我正在尝试转换的更正后的示例数据框:
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_unixtime
、unix_timestamp
和col
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'"))