Python 根据列获取pyspark中的本地时间

Python 根据列获取pyspark中的本地时间,python,datetime,apache-spark,pyspark,apache-spark-sql,Python,Datetime,Apache Spark,Pyspark,Apache Spark Sql,在pyspark中,可以通过传递时间戳和时区从UTC时间戳中获取本地时间 >>> df = spark.createDataFrame([('1997-02-28 10:30:00',)], ['t']) >>> df.select(from_utc_timestamp(df.t, "PST").alias('t')).collect() [Row(t=datetime.datetime(1997, 2, 28, 2, 30))] 这里的时区是作为字符串文本

在pyspark中,可以通过传递时间戳和时区
从UTC时间戳中获取本地时间

>>> df = spark.createDataFrame([('1997-02-28 10:30:00',)], ['t'])
>>> df.select(from_utc_timestamp(df.t, "PST").alias('t')).collect()
[Row(t=datetime.datetime(1997, 2, 28, 2, 30))]
这里的时区是作为字符串文本(“PST”)提供的。如果有以下数据结构:

+--------------------------+---------+
| utc_time                 |timezone |
+--------------------------+---------+
|  2018-08-03T23:27:30.000Z|  PST    |
|  2018-08-03T23:27:30.000Z|  GMT    |
|  2018-08-03T23:27:30.000Z|  SGT    |
+--------------------------+---------+
如何实现以下新专栏(最好没有UDF)

使用,这可以通过以下方式实现:

导入pyspark.sql.F函数
df=df.select(
'*',
F.expr('from_utc_timestamp(utc_time,timezone)')。别名(“timestamp_local”)
)
但是,不推荐使用3个字母的时区。根据:

为了与JDK1.1.x兼容,还支持其他一些三个字母的时区ID(如“PST”、“CTT”、“AST”)。但是,不推荐使用它们,因为同一缩写通常用于多个时区(例如,“CST”可以是美国的“中央标准时间”和“中国标准时间”),Java平台只能识别其中一个时区


您可以在上使用此方法,但
from_utc\u timestamp
似乎不喜欢
GMT
SGT
(返回时间戳列不变)。似乎不赞成使用3个字母的时区。谢谢@pault
+--------------------------+-----------------------------------+
| utc_time                 |timezone | local_time              |
+--------------------------+-----------------------------------+
|  2018-08-03T23:27:30.000Z|  PST    | 2018-08-03T15:27:30.000 |
|  2018-08-03T23:27:30.000Z|  GMT    | 2018-08-04T00:27:30.000 |
|  2018-08-03T23:27:30.000Z|  SGT    | 2018-08-04T07:27:30.000 |
+--------------------------+-----------------------------------+