【问题标题】:Create array of start/end of day datetimes in R在 R 中创建开始/结束日期时间数组
【发布时间】:2012-01-14 06:00:55
【问题描述】:

我正在使用 R 使用 zoo 和 chron 进行时间序列分析。我有一个包含大量数据的动物园对象,并且需要能够使用window 函数将数据子集为仅一天的价值,然后是第二天的价值,然后是下一天的价值,等等。

我试图找到最简单的方法来创建一个数组,其中包含特定时期内每一天的日期,并提出了以下内容:

orig = c(month=1, day=1, year=2005)
dates <- chron(1:1825, origin=orig, out.format=c(dates="d/m/y", times="h:m"))

这使用儒略日表示法,从我日期期间的第一天开始,有 1825 天(365*5 - 所以五年)。然后我尝试使用该数组的每个元素执行一个 for 循环:

for (date in dates)
{
  s = chron(date, "00:00:00", origin=orig)
  e = chron(date, "23:59:59", origin=orig)

  aeronet_day = window(aeronet, start=s, end=e)
}

但是,这给了我一个警告,说我正在为 aeronet zoo 对象和 se 变量使用不同的来源,并且它没有选择任何数据。

有没有更好的方法来做到这一点?或者有办法解决这个问题?基本上我想要的是运行一个 for 循环,在循环中我可以使用aeronet_day = window(aeronet, start=s, end=e) 代码生成一个包含一天数据的动物园对象(例如,2005 年 5 月 1 日从 00:00:00 到 23:59: 59.

【问题讨论】:

  • 我不确定您要做什么,但也许xts::apply.daily 可能会有所帮助?
  • 您使用chron zoo(有自己的时间序列格式)这一事实可能使您的代码/生活比应有的复杂.你可以只用一个或他们吗? (如果失败,请查看lubridate)。
  • @RichieCotton: zoo 没有任何时间序列格式。它与索引的类完全无关(即它甚至不必是基于时间的),它只需要排序。

标签: r time-series zoo chron


【解决方案1】:

假设我们有这个数据:

# create test data
library(zoo)
library(chron)
z <- zooreg(1:30, start = chron("2000-01-01"), freq = 2)

1) 聚合 R aggregate 函数有一个 zoo 方法。第二个参数是我们聚合的依据。如果它是一个函数,它将应用于动物园对象的索引。例如这里我们计算每个日期的平均值:

z.ag <- aggregate(z, as.Date, mean)

如果我们愿意,我们可以用更复杂的函数替换mean

2) 拆分。 R split 函数有一个 zoo 方法。如果我们真的想按日期拆分z,那么我们可以这样做。这里z.split.list 是一个列表,每个组件都包含一个日期的动物园对象。

z.split.list <- split(z, as.Date(time(z)))

现在 (a) sapply 或 (b) lapply 在该列表上或 (c) 使用以下内容(将 print(zc) 替换为所需的任何处理)。这里zc 是列表的一个组成部分,即它是仅通过特定日期形成的动物园对象:

for(zc in z.split.list) print(zc)

注意as.Date(time(z))是一个向量,其日期对应于z的元素。

编辑:

各种小细节。

【讨论】:

    【解决方案2】:

    我不熟悉动物园,但我通常只是将日期转换为数字,然后制作序列,然后再转换回来。例如:

    > as.Date(Sys.Date():(Sys.Date()+365), origin='1970-01-01')
      [1] "2011-12-06" "2011-12-07" "2011-12-08" "2011-12-09" "2011-12-10" "2011-12-11" "2011-12-12" "2011-12-13"
      [9] "2011-12-14" "2011-12-15" "2011-12-16" "2011-12-17" "2011-12-18" "2011-12-19" "2011-12-20" "2011-12-21"
     [17] "2011-12-22" "2011-12-23" "2011-12-24" "2011-12-25" "2011-12-26" "2011-12-27" "2011-12-28" "2011-12-29"
     [25] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04" "2012-01-05" "2012-01-06"
     [33] "2012-01-07" "2012-01-08" "2012-01-09" "2012-01-10" "2012-01-11" "2012-01-12" "2012-01-13" "2012-01-14"
     [41] "2012-01-15" "2012-01-16" "2012-01-17" "2012-01-18" "2012-01-19" "2012-01-20" "2012-01-21" "2012-01-22"
    ...
    

    【讨论】:

    • 对此,Sys.Date() + 0:365(利用+.Date方法)更加简洁!
    【解决方案3】:

    如果您想按日期做某事,那么您所拥有的就可以了。

    一些样本aeronet 数据。

    last_date <- 1825
    n <- 10000
    aeronet <- data.frame(
      some.value = seq_len(n), 
      date = as.chron(
        runif(n, 0, last_date), 
        origin = orig,
        out.format = c(dates = "d/m/y", times = "h:m")
      )
    )
    

    现在您可以使用split 按日期拆分数据,或者使用tapplyddplyplyr 将函数应用于每个日期(或使用aggregate 或其他)。

    with(aeronet, split(some.value, date))
    with(aeronet, tapply(some.value, date, sum))
    
    library(plyr)
    ddply(aeronet, .(date), summarise, sum(some.value))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 2015-09-21
      • 2021-09-06
      • 1970-01-01
      • 2020-10-26
      相关资源
      最近更新 更多