我有以下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"))
处理后,数据框显示为空。相反,这些值应转换为具有时区格式的时间戳。
请参阅文档了解格式说明符。 您正在使用:
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|
+----------------------------------+--------------------------+
>>>