在R中创建开始/结束一天的日期时间数组



我使用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 -所以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动物园对象和se变量使用了不同的起源,并且它没有选择任何数据。

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

假设我们有以下数据:

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

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

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

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

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

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

现在(a) sapply或(b) lapply在该列表上或(c)使用以下(用所需的任何处理替换print(zc))。这里zc是列表的一个组件,也就是说,它是一个zoo对象,仅由一个特定的日期组成:

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

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

编辑:

各种小的细化

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

> 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"
...

如果你想在每个日期的基础上做一些事情,那么你有什么是好的。

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))

最新更新