我正在尝试将一列 GMT 时间戳字符串转换为一列东部时区时间戳。我想考虑夏令时。
我的时间戳字符串列如下所示:
'2017-02-01T10:15:21+00:00'
我想出了如何将字符串列转换为 EST 中的时间戳:
from pyspark.sql import functions as F
df2 = df1.withColumn('datetimeGMT', df1.myTimeColumnInGMT.cast('timestamp'))
df3 = df2.withColumn('datetimeEST', F.from_utc_timestamp(df2.datetimeGMT, "EST"))
但是时间不会随着夏令时而改变。是否有其他函数或其他函数可以通过转换时间戳来考虑夏令时?
编辑:我想我明白了。在上面的 from_utc_timestamp 调用中,我需要使用“America/New_York”而不是“EST”:
df3 = df2.withColumn('datetimeET', F.from_utc_timestamp(df2.datetimeGMT, "America/New_York"))
我最终找到了答案,所以我想我会在这里添加它。我还认为这个问题/答案是值得的,因为当我在发布问题之前搜索这个问题时,我找不到关于 Spark 夏令时的任何信息。我可能应该意识到我应该搜索底层的 java 函数。
问题的答案最终是使用字符串“America/New_York”而不是“EST”。这正确地应用了夏令时。
from pyspark.sql import functions as F
df3 = df2.withColumn('datetimeET', F.from_utc_timestamp(df2.datetimeGMT, "America/New_York"))
编辑:
此链接显示了可以以此方式使用的可用时区字符串的列表:https://garygregory.wordpress.com/2013/06/18/what-are-the-java-timezone-ids/
我建议使用 unix_timestamp 将 utc_datetime_column 转换为时间戳类型,然后使用 from_utc_timestamp()。
from_utc_timestamp( unix_timestamp(datetime_column).cast(TimestanpType()),'美国/芝加哥')
这将解决夏令时问题。 to_timestamp() 代替 unix_timestamp() 不会处理夏令时。