我有几年的数据,我试图加入动物园对象(.csv at Dropbox)。一旦数据被强制转换为动物园对象,我就会发出错误。我在索引中找不到任何重复的内容。
df <- read.csv(choose.files(default = "", caption = "Select data source", multi = FALSE), na.strings="*")
df <- read.zoo(df, format = "%Y/%m/%d %H:%M", regular = TRUE, row.names = FALSE, col.names = TRUE, index.column = 1)
Warning message:
In zoo(rval3, ix) :
some methods for “zoo” objects do not work if the index entries in ‘order.by’ are not unique
我试过了:
sum(duplicated(df$NST_DATI))
但结果是0。
感谢您的帮助!
答案 0 :(得分:5)
您错误地使用了read.zoo(...)
。根据文件:
要处理索引,read.zoo调用FUN,索引为第一个 论点。如果未指定FUN,则表示存在多个索引 它们被粘贴在一起,每个列之间都有一个空格。使用 索引列或粘贴索引列:1。如果指定了tz,则为 index列转换为POSIXct。 2.如果指定了格式,那么 索引列将转换为日期。 3.否则,启发式 试图决定&#34;数字&#34;,&#34;日期&#34;和&#34; POSIXct&#34;。如果是格式 然后指定和/或tz,然后将它们传递给转换函数 同样。
您正在指定format=...
,因此read.zoo(...)
会将所有内容转换为日期,而不是POSIXct。显然,有许多重复的日期。
简单地说,正确的解决方案是使用:
df <- read.zoo(df, FUN=as.POSIXct, format = "%Y/%m/%d %H:%M")
# Error in read.zoo(df, FUN = as.POSIXct, format = "%Y/%m/%d %H:%M") :
# index has bad entries at data rows: 507 9243 18147 26883 35619 44355
但你可以看到这也不起作用。这里的问题更加微妙。索引使用POSIXct
转换,但在系统时区(我的系统中是美国东部)。引用的行的时间戳与从标准到DST的转换一致,因此美国东部时区的这些时间不存在。如果您使用:
df <- read.zoo(df, FUN=as.POSIXct, format = "%Y/%m/%d %H:%M", tz="UTC")
正确导入数据。
修改强>:
正如@ G.Grothendieck指出的那样,这也可行,而且更简单:
df <- read.zoo(df, tz="UTC")
您应该将tz
设置为适合数据集的任何时间段。