Python 在PySpark中将长历元时间戳转换为日期时间

Python 在PySpark中将长历元时间戳转换为日期时间,python,datetime,pyspark,epoch,Python,Datetime,Pyspark,Epoch,我有一个具有以下模式的spark数据帧: root |-- var1: long (nullable = true) |-- var2: long (nullable = true) |-- var3: long (nullable = true) |-- y_timestamp: long (nullable = true) |-- x_timestamp: long (nullable = true) 如何将时间戳转换为可读的日期时间变量 当前看起来是:156136513087要

我有一个具有以下模式的spark数据帧:

root
 |-- var1: long (nullable = true)
 |-- var2: long (nullable = true)
 |-- var3: long (nullable = true)
 |-- y_timestamp: long (nullable = true)
 |-- x_timestamp: long (nullable = true)
如何将时间戳转换为可读的日期时间变量


当前看起来是:
156136513087

要将时间戳转换为日期时间,您可以执行以下操作:

导入日期时间
时间戳=1545730073
dt_object=datetime.datetime.fromtimestamp(时间戳)
但是现在你的时间戳值太大了:你在51447年,这超出了范围

我想,这个值是timestamp=156136513.087:

dt_object=datetime.datetime.fromtimestamp(156136513.087)
打印(dt_对象)

您会得到:“2019-06-24 09:15:13.087000”

使用withColumn创建数据帧时,您可以将时间戳(以毫秒为单位)转换为秒,然后将其转换为时间戳

.withColumn("x_timestamp", spark_fns.expr("from_unixtime(x_timestamp/1000, 'yyyy-MM-dd')")

您可以首先将Unix时间戳转换为秒,然后通过强制转换为Spark时间戳将其转换为datetime(是的,Spark中的命名有点混乱-时间戳表示datetime)


它是一个Spark数据帧,其中时间戳变量以毫秒为单位。这对应于2019年6月24日星期一上午7:15:13.087。好的,您可以将时间戳除以1000以秒为单位。这是Python解决方案,而不是PySpark解决方案。
import pyspark.sql.functions as F

df.withColumn("var1_timestamp", (F.col("var1")/1000).cast("timestamp"))