【问题标题】:How do POSIXct timezones work in RPOSIXct 时区如何在 R 中工作
【发布时间】:2012-12-01 08:41:15
【问题描述】:

我有一组标准的 unix 整数时间戳,全部采用 UTC (GMT),我将其输入到我希望绘制的 R 中。我一直在使用以下形式的代码:

d$date_time <- as.POSIXct(d$date_time,origin="1970-01-01",tz="GMT")

将我的标准 unix 时间戳 UTC 整数列转换为我假设的某种可绘制对象集。我可以绘制这个并且数据看起来大致不错,但我不知道我的所有数据是否都被我的计算机的本地时区或任何其他时区调整以任何方式偏移。这是因为我不明白在 a) 我调用 as.POSIXct() 和 b) 绘制数据时会对数据进行哪些调整(如果有的话)。所以这些是我的问题:

  1. 当我在上面指定tz="GMT" 时,这到底是在告诉计算机做什么?我看到了三种可能性: i) “您的数据采用 GMT 格式,您希望将其转换为您的当地时间” ii)“您的数据始终假定为当地时间,您希望将其转换为 GMT”iii)“您的数据始终假定为 GMT,您希望我将其保留为 GMT,因此不要进行任何调整”。
  2. 当我绘制数据时(使用xyplot),绘图功能是否会对时间进行任何视觉调整?如果有,有哪些调整?

我认为,如果有人可以解释内部数据结构如何存储时区信息以及这些数据结构如何通过各种命令进行转换,那将有助于理清思路。基本上,我想从一开始就使用 UTC,直到显示点,我可能希望对时区进行调整,尽管理想情况下是明确的,而不是计算机默默地为我决定。

【问题讨论】:

  • AFAIK,数据始终以世界时间存储,并在打印时简单地显示为当地时间。我会尝试挖掘一个相关的问题。

标签: r timezone posixct


【解决方案1】:

R 的日期和时间类非常强大,但需要一些时间来适应。 TZ 调整尤其棘手,但它们与特定于/从角色的构造和转换相关。

考虑以下示例,该示例将自身限制为数字输入。我们有很好的控制:

R> tt <- as.POSIXct(0, origin="1970-01-01")
R> str(tt)
 POSIXct[1:1], format: "1970-01-01"
R> tt
[1] "1970-01-01 CST"
R> 
R> tt <- as.POSIXct(600, origin="1970-01-01")
R> tt
[1] "1970-01-01 00:10:00 CST"
R> 
tt <- as.POSIXct(600, origin="1970-01-01", tz="UTC")
R> tt
[1] "1970-01-01 00:10:00 UTC"
R> 
R> as.numeric(tt)
[1] 600
R> 

您可以获得完整的日期算术、转换、difftime() 等,并且仍然可以传递纯数值。另外:

R> tt <- as.POSIXct(600, origin="1970-01-01", tz="UTC")
R> tt
[1] "1970-01-01 00:10:00 UTC"
R> tt2 <- tt + 1.234567
R> tt2
[1] "1970-01-01 00:10:01.234566 UTC"
R> 

您可以使用attributes() 来检查是否设置了 TZ:

R> attributes(tt)
$tzone
[1] "UTC"

$class
[1] "POSIXct" "POSIXt" 

R> 

因此,如果您对创建和转换非常小心,您确实可以拥有一个完整的工具包,围绕基于 UTC 的时间数据。

【讨论】:

  • 所以关于原始问题中的2.,假设所有内容都在内部保持在UTC,那么像xyplot()这样的绘图功能通常在UTC中绘图,或者对当地​​时区进行调整(例如我在哪里,如果它进行调整,所有时间戳都会在视觉上移动 +10 小时)?
  • 您必须对其进行测试。请注意,您也可以通过Sys.setenv() 覆盖 R 会话的(默认和系统)时区值。也就是说,您还可以通过转到 as.numeric(timevariable) 并对其进行绘图来强制 x 轴值。
猜你喜欢
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 2018-02-04
相关资源
最近更新 更多