【问题标题】:How do you convert dates/times from one time zone to another in R?如何在 R 中将日期/时间从一个时区转换为另一个时区?
【发布时间】:2010-11-26 13:51:45
【问题描述】:

如果我在伦敦时间有这样的日期:“2009-06-03 19:30”,如何将其转换为美国西海岸的等效时间?

【问题讨论】:

标签: r


【解决方案1】:

首先,将伦敦时间转换为POSIXct 对象:

pb.txt <- "2009-06-03 19:30"
pb.date <- as.POSIXct(pb.txt, tz="Europe/London")

然后使用format打印另一个时区的日期:

> format(pb.date, tz="America/Los_Angeles",usetz=TRUE)
[1] "2009-06-03 11:30:00 PDT"

有一些技巧可以找到要使用的正确时区标识符。更多详情请参阅革命博客上的这篇文章:Converting time zones in R: tips, tricks and pitfalls

【讨论】:

  • 格式会将posix对象转换为字符。
  • 此转换是否考虑夏令时调整?
  • 是的,如果位置在时区数据库中,它确实会进行适当的递增/递减。
  • 在哪里可以找到“tz”s的数据库?
  • as.POSIXct(format(pb.date, tz="America/Los_Angeles",usetz=TRUE)) 将解决转换为字符。
【解决方案2】:

使用attr()(base R)或lubridate::with_tz()(tidyverse)查看不同时区的同一时刻。

POSIXct 对象的内部值始终为 UTC(自 1970 年初以来的秒数;请参阅?DateTimeClasses,但打印时显示的时间由tzone 属性决定。所以更改tzone属性(通过attr()lubridate::with_tz())在不同的时区显示/打印同一时刻。

例如:

pb.txt <- "2009-06-03 19:30"  
pb.date <- as.POSIXct(pb.txt, tz="Europe/London") 

注意 tzone 属性确定显示/打印时使用的时区:

attributes(pb.date)$tzone
[1] "Europe/London"

pb.date
[1] "2009-06-03 19:30:00 BST"

请注意,无论 tzone 属性如何,内部值都是自 UTC 起源以来的秒数:

as.numeric(pb.date)
[1] 1244053800

在基础 R 中,可以使用 attr() 设置/更改 tzone 属性:

attr(pb.date, "tzone") <- "America/Los_Angeles"

pb.date  
[1] "2009-06-03 11:30:00 PDT"  

等效地,使用lubridate::with_tz()(也使用attr):

pb.date <- lubridate::with_tz(pb.date, "America/Los_Angeles")

请注意,显示时间现在是 PDT 中的本地时钟时间:

pb.date  
[1] "2009-06-03 11:30:00 PDT"

但内部价值没有改变:

as.numeric(pb.date)
[1] 1244053800

所以tzone不影响任何操作,只影响打印时显示的值。

【讨论】:

  • 不要忘记查看已接受答案的 cmets (blog.revolution-computing.com/2009/06/…) 中发布的链接。我使用 EST 并认为这个答案不起作用!
  • 或者,attr(pb.date, "tzone") &lt;- "America/Los_Angeles"
【解决方案3】:

lubridate 包含两个函数来转换时区。根据帮助页面:


force_tz 在新时区返回与x 时钟时间相同的日期时间。

force_tz(time, tzone = "America/Los_Angeles")


with_tz 更改显示瞬间的时区。即时显示的时钟时间会发生变化,但所描述的时刻保持不变。

with_tz(time, tzone = "America/Los_Angeles")

【讨论】:

  • 比其他方法干净得多。
【解决方案4】:

如果您想在一行中执行此操作,请记住 R 中的任何 POSIXct 对象实际上只是一个数字(自纪元开始以来的秒 UTC),并且“时区”只是一个属性,它决定如何该号码是打印出来的

因此,我们可以使用.POSIXct辅助函数如下:

x = as.POSIXct("2009-06-03 19:30", tz = "Europe/London")
.POSIXct(as.integer(x), tz = 'America/Los_Angeles')
# [1] "2009-06-03 11:30:00 PDT"

as.integer剥离x的类和属性,.POSIXct是构造POSIXct对象的简写;如果您的对象有毫秒并且您想跟踪它们,您可以使用as.numeric(x)

【讨论】:

  • 刚刚修正了一个错字,并添加了 origin 以防止错误 x = as.POSIXct("2009-06-03 19:30", tz = "Europe/London") x = as.POSIXct( as.integer(x), tz = 'America/Los_Angeles', origin = '1970-01-01') x
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 2015-11-05
  • 2011-04-23
  • 2015-02-21
相关资源
最近更新 更多