Chr*_*per 7 python-3.x apache-spark-sql pyspark
我正在尝试使用 to_timestamp 将带有时区的日期时间字符串转换为时间戳。
示例数据框:
df = spark.createDataFrame([("a", '2020-09-08 14:00:00.917+02:00'),
("b", '2020-09-08 14:00:00.900+01:00')],
["Col1", "date_time"])
Run Code Online (Sandbox Code Playgroud)
我的尝试(使用时区说明符 Z):
df = df.withColumn("timestamp",f.to_timestamp(df.date_time, "yyyy-MM-dd HH:mm:ss.SSSZ"))
df.select('timestamp').show()
Run Code Online (Sandbox Code Playgroud)
实际结果:
+---------+
|timestamp|
+---------+
| null|
| null|
+---------+
Run Code Online (Sandbox Code Playgroud)
想要的结果(其中时间戳是时间戳类型):
+-------------------------+
| timestamp|
+-------------------------+
|2020-09-08 14:00:00+02:00|
|2020-09-08 14:00:00+01:00|
+-------------------------+
Run Code Online (Sandbox Code Playgroud)
我也尝试过许多其他版本的格式,但我似乎找不到合适的版本。
据我所知,不可能用时区解析时间戳并直接保留其原始形式。
问题是to_timestamp()&date_format()函数会自动将它们转换为本地计算机的时区。
我可以建议您解析时间戳并将其转换为 UTC,如下所示,
df.withColumn('local_ts', date_format(df.date_time, "yyyy-MM-dd HH:mm:ss.SSSX")) \
.withColumn("timestamp_utc",to_utc_timestamp(to_timestamp(df.date_time, "yyyy-MM-dd HH:mm:ss.SSSX"), 'America/New_York')) \
.show(10, False)
# America/New_York is machine's timezone
+----+-----------------------------+--------------------------+-----------------------+
|Col1|date_time |local_ts |timestamp_utc |
+----+-----------------------------+--------------------------+-----------------------+
|a |2020-09-08 14:00:00.917+02:00|2020-09-08 08:00:00.917-04|2020-09-08 12:00:00.917|
|b |2020-09-08 14:00:00.900+01:00|2020-09-08 09:00:00.900-04|2020-09-08 13:00:00.9 |
+----+-----------------------------+--------------------------+-----------------------+
Run Code Online (Sandbox Code Playgroud)
如果您仍然喜欢保留其原始形式,那么我想您应该udf为此编写一个自定义。
| 归档时间: |
|
| 查看次数: |
23493 次 |
| 最近记录: |