【问题标题】:Convert UTC timestamp to local time based on time zone in PySpark根据 PySpark 中的时区将 UTC 时间戳转换为本地时间
【发布时间】:2019-12-02 19:12:57
【问题描述】:

我有一个 PySpark DataFrame,df,其中一些列如下所示。 hour 列是 UTC 时间,我想创建一个基于 time_zone 列的具有本地时间的新列。我怎样才能在 PySpark 中做到这一点?

df
    +-------------------------+------------+
    |  hour                   | time_zone  |
    +-------------------------+------------+
    |2019-10-16T20:00:00+0000 | US/Eastern |
    |2019-10-15T23:00:00+0000 | US/Central |
    +-------------------------+------------+

#What I want:
    +-------------------------+------------+---------------------+
    |  hour                   | time_zone  | local_time          |
    +-------------------------+------------+---------------------+
    |2019-10-16T20:00:00+0000 | US/Eastern | 2019-10-16T15:00:00 |
    |2019-10-15T23:00:00+0000 | US/Central | 2019-10-15T17:00:00 |
    +-------------------------+------------+---------------------+

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可以使用内置的from_utc_timestamp 函数。请注意,hour 列需要作为字符串不带时区传递给函数。

    以下代码适用于从 2.4 开始的 spark 版本。

    from pyspark.sql.functions import *
    df.select(from_utc_timestamp(split(df.hour,'\+')[0],df.time_zone).alias('local_time')).show()
    

    对于 2.4 之前的 spark 版本,您必须将表示时区的常量字符串作为第二个参数传递给函数。

    Documentation

    pyspark.sql.functions.from_utc_timestamp(timestamp, tz)

    这是支持 TIMESTAMP WITHOUT TIMEZONE 的数据库的常用功能。此函数采用与时区无关的时间戳,并将其解释为 UTC 时间戳,并将该时间戳呈现为给定时区中的时间戳。

    但是,Spark 中的时间戳表示从 Unix 纪元开始的微秒数,它与时区无关。所以在 Spark 中,这个函数只是将时间戳值从 UTC 时区转移到给定的时区。

    如果输入是带时区的字符串,例如,此函数可能会返回令人困惑的结果。 ‘2018-03-13T06:18:23+00:00’。原因是Spark首先根据字符串中的时区将字符串转换为时间戳,最后根据会话本地时区将时间戳转换为字符串来显示结果。

    参数 timestamp – 包含时间戳的列

    tz – 具有时区 ID 的字符串,例如“格林威治标准时间”、“美国/洛杉矶”等

    2.4 版更改:tz 可以采用包含时区 ID 字符串的列。

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 2021-12-12
      • 2019-08-15
      • 2018-04-17
      • 1970-01-01
      • 2019-01-05
      • 2013-03-23
      • 2011-02-06
      • 2013-06-30
      相关资源
      最近更新 更多