【问题标题】:Pyspark to_timestamp with timezonePyspark to_timestamp 与时区
【发布时间】:2020-09-08 16:20:52
【问题描述】:

我正在尝试使用 to_timestamp 将带有时区的日期时间字符串转换为时间戳。

示例数据框:

df = spark.createDataFrame([("a", '2020-09-08 14:00:00.917+02:00'), 
                            ("b", '2020-09-08 14:00:00.900+01:00')], 
                           ["Col1", "date_time"])

我的尝试(使用时区说明符 Z):

df = df.withColumn("timestamp",f.to_timestamp(df.date_time, "yyyy-MM-dd HH:mm:ss.SSSZ"))
df.select('timestamp').show()

实际结果:

    +---------+
    |timestamp|
    +---------+
    |     null|
    |     null|
    +---------+

想要的结果(其中时间戳是时间戳类型):

+-------------------------+
|                timestamp|
+-------------------------+
|2020-09-08 14:00:00+02:00|
|2020-09-08 14:00:00+01:00|
+-------------------------+

我也尝试了许多其他版本的格式,但我似乎找不到合适的。

【问题讨论】:

    标签: python-3.x pyspark apache-spark-sql


    【解决方案1】:

    据我所知,无法用时区解析时间戳并直接保留其原始形式。

    问题在于to_timestamp()date_format() 函数会自动将它们转换为本地机器的时区。

    我可以建议您解析时间戳并将其转换为 UTC,如下所示,

    df.withColumn('local_ts', date_format(df.date_time, "yyyy-MM-dd HH:mm:ss.SSSX")) \
      .withColumn("timestamp_utc",to_utc_timestamp(to_timestamp(df.date_time, "yyyy-MM-dd HH:mm:ss.SSSX"), 'America/New_York')) \
      .show(10, False) 
    
    # America/New_York is machine's timezone
    
    +----+-----------------------------+--------------------------+-----------------------+
    |Col1|date_time                    |local_ts                  |timestamp_utc          |
    +----+-----------------------------+--------------------------+-----------------------+
    |a   |2020-09-08 14:00:00.917+02:00|2020-09-08 08:00:00.917-04|2020-09-08 12:00:00.917|
    |b   |2020-09-08 14:00:00.900+01:00|2020-09-08 09:00:00.900-04|2020-09-08 13:00:00.9  |
    +----+-----------------------------+--------------------------+-----------------------+
    

    如果您仍然喜欢保留其原始形式,那么我想您应该为此编写一个自定义 udf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2016-02-23
      • 2023-02-23
      • 1970-01-01
      • 2020-07-17
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多