将字符串转换为带有毫秒和时区的日期时间 - Pyspark

问题描述 投票:0回答:1

我有以下3个时间记录(最初它是作为字符串)要转换为时间戳。

CreateDate
2022-01-24 08:37:21.6670097 -06:00
2022-01-26 14:11:54.1950238 -06:00
2022-12-28 09:05:35.4445072 -06:00

我尝试了以下方法

df = df.withColumn('CreateDate', sf.to_timestamp('CreateDate', "yyyy-MM-dd HH:mm:ss.SSS Z"))

处理后,数据框显示为空。相反,这些值应转换为具有时区格式的时间戳。

string datetime pyspark timezone
1个回答
0
投票

请参阅文档了解格式说明符。 您正在使用:

  • SSS
    ,应该使用
    SSSSSSS
    ——这很不寻常。通常是微秒(3 位数字)或纳秒(6 位数字)秒。
  • Z
    ,应该使用
    ZZZZZ

分数:使用一个或多个(最多 9 个)连续的“S”字符,例如 SSSSSS,来解析和格式化秒的分数。对于解析,可接受的分数长度可以是[1,连续“S”的数量]。为了进行格式化,分数长度将被填充为带有零的连续“S”的数量。 Spark 支持微秒精度的日期时间,最多有 6 位有效数字,但可以解析纳秒级,超出的部分会被截断。

偏移 Z:根据模式字母的数量设置偏移格式。一个、两个或三个字母输出小时和分钟,不带冒号,例如“+0130”。当偏移量为零时,输出将为“+0000”。四个字母输出完整形式的本地化偏移量,相当于四个字母的 Offset-O。如果偏移量为零,则输出将是相应的本地化偏移文本。五个字母输出小时、分钟,如果非零则可选秒,并带有冒号。如果偏移量为零,则输出“Z”。六个或更多字母将失败。

>>> df = spark.createDataFrame(dstr=[
... ('2022-01-24 08:37:21.6670097 -06:00',),
... ('2022-01-26 14:11:54.1950238 -06:00',),
... ('2022-12-28 09:05:35.4445072 -06:00',),
... ], schema='dstr: string')
>>> 
>>> df = df.withColumn('CreateDate', sf.to_timestamp('dstr', "yyyy-MM-dd HH:mm:ss.SSSSSSS ZZZZZ"))
>>> df.collect()
[
Row(dstr='2022-01-24 08:37:21.6670097 -06:00', CreateDate=datetime.datetime(2022, 1, 24, 8, 37, 21, 667009)), 
Row(dstr='2022-01-26 14:11:54.1950238 -06:00', CreateDate=datetime.datetime(2022, 1, 26, 14, 11, 54, 195023)), 
Row(dstr='2022-12-28 09:05:35.4445072 -06:00', CreateDate=datetime.datetime(2022, 12, 28, 9, 5, 35, 444507))
]
>>> df.show(truncate=False)
+----------------------------------+--------------------------+
|dstr                              |CreateDate                |
+----------------------------------+--------------------------+
|2022-01-24 08:37:21.6670097 -06:00|2022-01-24 08:37:21.667009|
|2022-01-26 14:11:54.1950238 -06:00|2022-01-26 14:11:54.195023|
|2022-12-28 09:05:35.4445072 -06:00|2022-12-28 09:05:35.444507|
+----------------------------------+--------------------------+

>>>
© www.soinside.com 2019 - 2024. All rights reserved.