为什么read.zoo在时间可用时给出索引作为日期

时间:2014-08-28 20:06:10

标签: r zoo posixct

我试图通过输入动物园对象来理解我过去的困难。 read.zoo的以下两个用法给出了不同的结果,尽管tz的默认参数应该是“”,这是两个read.zoo调用之间的唯一区别:

Lines <- "2013-11-25 12:41:21         2 
2013-11-25 12:41:22.25      2 
2013-11-25 12:41:22.75      75 
2013-11-25 12:41:24.22      3 
2013-11-25 12:41:25.22      1 
2013-11-25 12:41:26.22      1"

library(zoo)
z <- read.zoo(text = Lines, index = 1:2)

> dput(z)
structure(c(2L, 2L, 75L, 3L, 1L, 1L), index = structure(c(16034, 
16034, 16034, 16034, 16034, 16034), class = "Date"), class = "zoo")

z <- read.zoo(text = Lines, index = 1:2, tz="")
> dput(z)
structure(c(2L, 2L, 75L, 3L, 1L, 1L), index = structure(c(1385412081, 
1385412082.25, 1385412082.75, 1385412084.22, 1385412085.22, 1385412086.22
), class = c("POSIXct", "POSIXt"), tzone = ""), class = "zoo")
> 

3 个答案:

答案 0 :(得分:9)

答案(当然)在read.zoo()的来源中,其中有:

....
ix <- if (missing(format) || is.null(format)) {
    if (missing(tz) || is.null(tz)) 
        processFUN(ix)
    else processFUN(ix, tz = tz)
}
else {
    if (missing(tz) || is.null(tz)) 
        processFUN(ix, format = format)
    else processFUN(ix, format = format, tz = tz)
}
....

即使tz默认"",在您的第一种情况下,tz被视为缺失(missing()),因此{ {1}}被使用。当您设置processFUN(ix)时,它不再缺失,因此您获得tz = ""

如果不查看processFUN(ix, tz = tz)的详细信息,可以通过在参数中使用read.zoo()tz = NULL(无默认值)然后在代码中更好地处理这个问题,如果{{1}由于某种原因需要设置为tz,执行:

tz

或者如果要求所有这些都是为了避免混淆两个不同的电话,甚至不需要这个?

答案 1 :(得分:3)

实际上,默认索引类为"Date",除非使用tz,在这种情况下默认值为"POSIXct"。因此,问题中的第一个示例提供了"Date"类,因为这是默认值,第二个"POSIXct"指定了tz

如果要在不使用这些默认值的情况下指定类,则要明确使用FUN参数:

read.zoo(...whatever..., FUN = as.Date)
read.zoo(...whatever..., FUN = as.POSIXct) # might need FUN=paste,FUN2=as.POSIXct
read.zoo(...whatever..., FUN = as.yearmon)
# etc. 

FUN参数也可以采用自定义函数,如包中的示例所示。

请注意,如果未指定格式,则始终采用标准格式(例如"%Y-%m-%d"类的"Date"),并且永远不会尝试自动确定格式。

?read.zoo详细解释了它的工作方式,?read.zoo中有很多例子(示例部分中有78行代码)以及整个插图(其中一个六个小插曲专门致力于read.zoo&#34; :Reading Data in zoo

已添加已展开以上内容。此外,在可用的动物园here的开发版本中,启发式已得到改进,并且通过该改进,问题中的第一个示例确实识别日期/时间并选择POSIXct。此外,还在read.zoo帮助文件中添加了对简单启发式的一些说明,以便不必依赖提供的许多示例。

以下是一些例子。请注意,引用的启发式是一种启发式方法,仅用于确定时间索引的。它只能识别"numeric""Date""POSIXct"类。启发式无法识别其他类(尽管您可以使用FUN=自行指定它们)。启发式也不识别格式。如果未使用format=提供格式或通过FUN=隐式提供格式,则采用标准格式,例如在"%Y-%m-%d"的情况下"Date"

Lines <- "2013-11-25 12:41:21  2 
2013-12-25 12:41:22.25      3 
2013-12-26 12:41:22.75      8"

# explicit.  Uses POSIXct.
z <- read.zoo(text = Lines, index = 1:2, FUN = paste, FUN2 = as.POSIXct) 

# tz implies POSIXct
z <- read.zoo(text = Lines, index = 1:2, tz = "")

# heuristic: Date now; devel ver uses POSIXct
z <- read.zoo(text = Lines, index = 1:2) 


Lines <- "2013-11-251  2 
2013-12-25 3 
2013-12-26 8"

z <- read.zoo(text = Lines, FUN = as.Date) # explicit.  Uses Date.
z <- read.zoo(text = Lines, format = "%Y-%m-%d") # format & no tz implies Date
z <- read.zoo(text = Lines) # heuristic: Date

注意:

(1)一般而言,使用FUN或使用tz和/或format而不是依赖于启发式,更明确。如果您使用FUN或使用tz和/或format进行半明确表示明确,则read.zoo的当前版本和开发版本之间不会发生任何变化。< / p>

(2)依靠文档而不是内部更安全,因为内部可以在没有警告的情况下进行更改,实际上在开发版本中已经发生了变化。如果你真的想查看代码,那么如果FUN没有明确定义,则选择索引类的关键语句是if (is.null(FUN)) ...源中的read.zoo语句。

(3)我建议使用read.zoo更简单,更直接,更紧凑,而不是read.table后跟zoo等变通办法。我和其他许多人一样使用read.zoo多年来对我来说似乎非常可靠但是如果有人发现read.zoo或文档的特定问题(总是可能的,因为它有很多)他们总能得到报道。尽管包装已经存在多年,但仍在进行改进。

答案 2 :(得分:2)

我怀疑你使用read.zoo绊倒了你。这是我做的:

library(zoo)
tt <- read.table(text=Lines)
z <- zoo(as.integer(tt[,3]), order.by=as.POSIXct(paste(tt[,1], tt[,2])))

现在z是一个合适的动物园对象:

R> z
2013-11-25 12:41:21.00 2013-11-25 12:41:22.25 2013-11-25 12:41:22.75 
                     2                      2                     75  
2013-11-25 12:41:24.22 2013-11-25 12:41:25.22 2013-11-25 12:41:26.22 
                     3                      1                      1 
R> class(z)
[1] "zoo"
R> class(index(z))
[1] "POSIXct" "POSIXt" 
R> 

通过确保我使用POSIXct对象作为索引,我实际上得到了一个POSIXct对象。