【发布时间】:2019-04-17 16:21:27
【问题描述】:
我正在尝试将包含日期和时间作为字符串的列转换为时间戳,但是在转换过程中我丢失了毫秒部分。
数据
我有一个 Spark 数据框 df,它有一个包含字符串的日期和时间列。时间字符串包含毫秒,如下图:
+---------+------------+
|date |time |
+---------+------------+
|2018/1/2 |09:53:25.864|
|2018/1/3 |11:32:21.689|
|2018/1/4 |09:34:51.045|
+---------+------------+
我尝试了什么
我将date 和time 列连接起来得到date_and_time 列(字符串):
import spark.sql.functions as F
df = df.withColumn('date_and_time', F.concat_ws(' ', df.date, df.time))
df.show(3, False)
输出:
+--------+------------+---------------------+
|date |time |date_and_time |
+--------+------------+---------------------+
|2018/1/2|09:53:25.864|2018/1/2 09:53:25.864|
|2018/1/3|11:32:21.689|2018/1/3 11:32:21.689|
|2018/1/4|09:34:51.045|2018/1/4 09:34:51.045|
+--------+------------+---------------------+
然后,我使用Simple Date Format Date and Time patterns指定了时间戳格式:
timestamp_format = 'yyyy/M/d HH:mm:ss.SSS'
然后,我尝试使用几种不同的方式将此字符串转换为时间戳:
df.select(
df.date_and_time,
F.to_timestamp(df.date_and_time, timestamp_format).alias('method_1'),
F.unix_timestamp(df.date_and_time, format=timestamp_format).cast('timestamp').alias('method_2')
).show(3, False)
如下所示,时间戳缺少毫秒部分:
+---------------------+-------------------+-------------------+
|date_and_time |method_1 |method_2 |
+---------------------+-------------------+-------------------+
|2018/1/2 09:53:25.864|2018-01-02 09:53:25|2018-01-02 09:53:25|
|2018/1/3 11:32:21.689|2018-01-03 11:32:21|2018-01-03 11:32:21|
|2018/1/4 09:34:51.045|2018-01-04 09:34:51|2018-01-04 09:34:51|
+---------------------+-------------------+-------------------+
如何在将字符串转换为时间戳时保留毫秒?
我正在使用 PySpark(Spark:2.3.1,Python:3.6.5)。
我查看了之前回答的关于 SO 的问题,但没有找到合适的解决方案。
【问题讨论】:
标签: python python-3.x apache-spark pyspark timestamp