在PySpark中将Unix时间戳转换为ms时间戳

时间:2020-04-16 08:40:13

标签: python dataframe pyspark timestamp unix-timestamp

我在数据框 timestamp 中有一列,其中包含UNIX的13位时间戳,如下所示:

|   timestamp   | 
| ------------- |
| 1584528257638 |
| 1586618807677 |
| 1585923477767 |
| 1583314882085 |

使用熊猫很容易将其转换为:

ms = pd.to_datetime(df[column], unit='ms')
df[column] = ms

但是,在pySpark中并不是那么容易,我发现了其他一些东西,例如this post,试图实现这一目标。 最后一毫秒的连接对我不起作用,它始终导致第二个时间戳(HH:mm:ss)而不是HH:mm:ss.SSS。

到目前为止,我尝试过的是:

df = df.withColumn("unix_timestamp", F.unix_timestamp(df.timestamp,'yyyy-MM-dd HH:mm:ss.SSS z') + F.substring(df.timestamp, -3,3).cast('float')/1000)

df = df.withColumn("ms_Timestamp", F.to_timestamp(df["unix_timestamp"]))

不幸的是,这并没有将其转换为毫秒级的时间戳,我也不知道该怎么办。

对于最终获得毫秒级时间戳的任何帮助,我将不胜感激。

最好,谢谢。

1 个答案:

答案 0 :(得分:2)

默认 to_timestamp, from_unixtime, unix_timestamp 函数将不会产生毫秒数。

但是要解决此问题,请使用 from_unixtime concat 函数来获取带有毫秒的时间戳。

#using substring function
df.withColumn("unix_timestamp", concat_ws(".",from_unixtime(substring(col("timestamp"),0,10),"yyyy-MM-dd HH:mm:ss"),substring(col("timestamp"),-3,3))).show(10,False)

#using divide function
df.withColumn("unix_timestamp", concat_ws(".",from_unixtime((col("timestamp")/1000),"yyyy-MM-dd HH:mm:ss"),substring(col("timestamp"),-3,3))).show(10,False)
#+-------------+-----------------------+
#|timestamp    |unix_timestamp         |
#+-------------+-----------------------+
#|1584528257638|2020-03-18 05:44:17.638|
#|1586618807677|2020-04-11 10:26:47.677|
#|1585923477767|2020-04-03 09:17:57.767|
#|1583314882085|2020-03-04 03:41:22.085|
#+-------------+-----------------------+