【问题标题】:Date (mis)alignment with newest version of xts日期(错误)与最新版本的 xts 对齐
【发布时间】:2013-07-21 12:34:55
【问题描述】:

新版本的 xts 在合并具有不同日期类索引的 xts 时似乎有不同的行为。

这是一个代码示例:

library(xts)
x1=xts(1:2,as.Date(c('1990-01-01','1991-01-01')))
x2=xts(3:4,as.POSIXct(c('1990-01-01','1991-01-01')))
merge(x1,x2)

使用来自 r-forge 的最新版本 0.9-5.1 输出:

           x1 x2
1990-01-01  1  NA
1990-01-01 NA  3
1991-01-01  2  NA
1991-01-01  NA 4

同样使用版本0.8-6版本:

           x1 x2
1990-01-01  1  3
1991-01-01  2  4

有没有办法强制 xts 在合并之前将索引转换为同一个类(就像以前一样),或者现在让它工作的唯一方法是在合并之前自己强制索引类?

如果有对象属性,您可以在其中指定您在使用它时关心的时间精度级别(如果您使用日常数据等,则忽略时间),这将是很棒的。

【问题讨论】:

  • 谢谢 - 请注意,您需要先编辑表格,然后再将其发布到此处。希望现在这个问题看起来可读
  • r-forge 的版本是 dev 版本,在 CRAN 上你有 0.9.5 并且它可以工作
  • 0.9.5 的行为方式与 0.9.5-1 相同(输出相同且问题未修复)
  • 你确定吗?我写了我的输出给你看
  • > sessionInfo() R 版本 2.15.3 (2013-03-01) 平台:x86_64-pc-linux-gnu (64-bit) [..SKIPPED..] 其他附加包:[ 1] xts_0.9-5 zoo_1.7-10 产生与原始帖子相同的输出。你在哪个 R 版本/平台上?

标签: r date alignment xts


【解决方案1】:

编辑:我不确定它在 0.8-6 中工作的事实是错误还是期望的行为。

这是一个时区问题。日期被认为是 UTC 中的午夜,因此x1 的索引采用 UTC。但是,x2 具有您操作系统的时区。 xts 对象的索引始终在内部存储为 POSIXct,它是自 UTC 纪元以来的秒数。如果您的时区不是 UTC,那么当 UTC 日期在您的操作系统时区转换为 POSIXct 时,时间将不匹配。一种解决方法是将其中一个的索引转换为与另一个匹配。

> # Convert the POSIXct index to Date
> index(x2) <- as.Date(index(x2))
> merge(x1,x2)
           x1 x2
1990-01-01  1  3
1991-01-01  2  4

> x2 <- xts(3:4,as.POSIXct(c('1990-01-01','1991-01-01')))
> # Convert the Date index to POSIXct
> index(x1) <- as.POSIXct(format(index(x1)))
> merge(x1, x2)
           x1 x2
1990-01-01  1  3
1991-01-01  2  4

我使用了format,因为as.POSIXct.Date 没有使用tz 参数。


在此示例中,可以通过首先设置 TZ 环境变量来解决问题。当然,这可能会产生其他影响,具体取决于您使用时区的方式。而且,只有在创建 xts 对象之前设置时区变量才有效。

Sys.setenv(TZ="GMT")
x1=xts(1:2,as.Date(c('1990-01-01','1991-01-01')))
x2=xts(3:4,as.POSIXct(c('1990-01-01','1991-01-01')))
merge(x1, x2)
           x1 x2
1990-01-01  1  3
1991-01-01  2  4

【讨论】:

  • 谢谢 - 希望有一种解决方法,不涉及更改一堆代码以升级到最新的 xts 版本
【解决方案2】:

不是答案,只是为了向 OP 表明 CRAN 版本没有问题(至少对我而言)

library(xts)
x1=xts(1:2,as.Date(c('1990-01-01','1991-01-01')))
x2=xts(3:4,as.POSIXct(c('1990-01-01','1991-01-01')))

R> merge(x1,x2)
           x1 x2
1990-01-01  1  3
1991-01-01  2  4
R> packageVersion("xts")
[1] ‘0.9.5’

【讨论】:

  • 嗯?你确定你有当前的 CRAN 版本吗?
  • 您是否设置了时区环境变量?
  • 不,我的时区环境未设置未设置,是的,如果我没记错的话,我是从 CRAN 下载的。我重新下载测试看看
  • 我可以复制它,仍然是相同的输出。我在 vanilla 中启动 R 并上传 zoo 然后 xts 并运行相同的代码,我有相同的输出
  • 这对您有用,因为您是 UTC,并且具有 Date 类索引的 xts 对象具有 UTC 时区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 2022-06-17
相关资源
最近更新 更多