【问题标题】:Conversion from `zoo` to `xts` creates lots of NAs in the index从 `zoo` 到 `xts` 的转换会在索引中创建大量 NA
【发布时间】:2023-03-03 05:47:19
【问题描述】:

我有一个相当奇怪的问题,可能最好用一个 R 会话的例子来描述。按照下面 cmets 中的要求,我已尝试使其可重现。

meto <- structure(c(30, 25, 25, 25, 20, 20, 20, 20, 20, 20), index = structure(c(12796, 
            12796.0416666667, 12796.0833333333, 12796.125, 12796.1666666667, 
            12796.2083333333, 12796.25, 12796.2916666667, 12796.3333333333, 
            12796.375), format = structure(c("d/m/y", "h:m:s"), .Names = c("dates", 
            "times")), origin = structure(c(1, 1, 1970), .Names = c("month", 
            "day", "year")), class = c("chron", "dates", "times")), class = "zoo")

示例数据集如下所示:

> meto
(13/01/05 00:00:00) (13/01/05 01:00:00) (13/01/05 02:00:00) (13/01/05 03:00:00) (13/01/05 04:00:00) 
                 30                  25                  25                  25                  20 
(13/01/05 05:00:00) (13/01/05 06:00:00) (13/01/05 07:00:00) (13/01/05 08:00:00) (13/01/05 09:00:00) 
                 20                  20                  20                  20                  20 
> str(meto)
‘zoo’ series from (13/01/05 00:00:00) to (13/01/05 09:00:00)
  Data: num [1:10] 30 25 25 25 20 20 20 20 20 20
  Index: Classes 'chron', 'dates', 'times'  atomic [1:10] 12796 12796 12796 12796 12796 ...
  ..- attr(*, "format")= Named chr [1:2] "d/m/y" "h:m:s"
  .. ..- attr(*, "names")= chr [1:2] "dates" "times"
  ..- attr(*, "origin")= Named num [1:3] 1 1 1970
  .. ..- attr(*, "names")= chr [1:3] "month" "day" "year"

当我们转换为 XTS 时:

m <- as.xts(meto)

这会导致以下输出:

> str(m)
An ‘xts’ object from NA to NA containing:
  Data: num [1:10, 1] 30 25 25 25 20 20 20 20 20 20
  Indexed by objects of class: [chron,dates,times] TZ: 
  xts Attributes:  
 NULL
> summary(m)
     Index          m       
 Min.   :NA   Min.   :20.0  
 1st Qu.:NA   1st Qu.:20.0  
 Median :NA   Median :20.0  
 Mean   :NA   Mean   :22.5  
 3rd Qu.:NA   3rd Qu.:25.0  
 Max.   :NA   Max.   :30.0  
 NA's   :10                 
Warning message:
In data.row.names(row.names, rowsi, i) :
  some row.names duplicated: 2,3,4,5,6,7,8,9,10 --> row.names NOT used

如您所见,动物园时间序列中有很多数据,由 chron 对象索引。但是,当我使用as.xts 将其转换为xts 时间序列时,它看起来可以开始......但str 命令显示NAs 并将meto 的摘要与m 进行比较表明超过已在索引中创建了 36,000 个 NA!

有谁知道为什么会发生这种情况,或者我可以做些什么来解决它?

【问题讨论】:

  • 没有实际的数据集,很难提供答案。尝试创建一个重现此问题的模型数据集。您可以添加几行代码来在您的帖子中创建模型数据集,以便我们可以运行代码。此外,提出一个可重现的示例有时已经解决了问题:)。
  • 谢谢保罗。有没有办法轻松地将数据集的一部分转储到可以从命令行轻松读回的字符串?我能想到的提供数据的唯一方法(除了手动创建数据)是提供 CSV 文件以供下载。
  • @LouisChiffre:谢谢,这正是我想要的。
  • @PaulHiemstra:我让它可重现(我认为...)
  • 请注意,您可以简单地将dput 的结果分配给一个变量。因此我删除了多余的meto &lt;- dget(textConnection(... 代码。

标签: r time-series xts zoo


【解决方案1】:

问题是您的索引属于chron 类。我对chron 知之甚少,但AFAIK 通常更喜欢在R 中使用POSIX 日期时间对象,即POSIXctPOSIXlt

在从zooxts 的转换过程中,chron 类信息被破坏。

将您的索引转换为POSIXct 类可以解决问题。

index(meto) <- as.POSIXct(index(meto)) 
as.xts(meto)

                    [,1]
2005-01-13 00:00:00   30
2005-01-13 01:00:00   25
2005-01-13 01:59:59   25
2005-01-13 03:00:00   25
2005-01-13 04:00:00   20
2005-01-13 04:59:59   20
2005-01-13 06:00:00   20
2005-01-13 07:00:00   20
2005-01-13 07:59:59   20
2005-01-13 09:00:00   20

有关使用 R 日期和时间类的更多信息,请参阅 ?DateTimeClasses?POSIXct?strptime - 它们都指向同一个帮助页面。


编辑

如果xts 应该在从zoo 导入时处理chron 对象,那么您可能在函数xts::xts 中发现了一个错误。

问题出现在这一行:

if (inherits(order.by, "dates")) 
    index <- as.numeric(as.POSIXct(strptime(as.character(order.by), 
        "(%m/%d/%y %H:%M:%S)")))

但请注意,您的 chron 对象的格式是 ("d/m/y", "h:m:s") - 我从您的 str(meto) 知道这一点。仔细看 - 日期和月份之间存在偏差。

这很可能是语言环境问题。我相信包作者住在美国,标准格式是 m/d/y,但在许多其他地方,标准格式是 d/m/y。

因此,在 zoo 和 xts 之间的转换中,转换代码应该针对用户的语言环境进行调整。

我建议您联系包作者提供此信息。

【讨论】:

  • 通常我使用 POSIXct 处理日期时间。 Chron 对我来说也有点神秘。我听说 lubridate 非常适合这种东西。
  • 感谢安德烈 - 现在解决了它。但是,我仍然对为什么 chron 索引似乎不起作用感兴趣 - XTS 文档表明它们确实起作用(而且我有其他 XTS 对象的 chron 索引工作正常)
  • Lubridate 很有用,它为您提供了一些非常方便的 POSIXct 包装器。
  • @robintw 我认为你发现了一个错误。我试图在我的编辑中解释这个错误的性质。我建议你联系包作者。
  • 如果没有时区,那么 chron 优于 POSIXct,因为它消除了 POSIXct 可能引入的与时区相关的细微错误的可能性。见 R 新闻 4/1。
猜你喜欢
  • 2011-09-21
  • 2021-11-12
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 2012-08-29
相关资源
最近更新 更多