【问题标题】:R StackApply: create an 8-day index from daily data while accounting for yearR StackApply:从每日数据创建一个 8 天的索引,同时计算年份
【发布时间】:2018-12-19 09:23:22
【问题描述】:

我想创建一个索引,我可以在 StackApply 中使用它来将每日降雨量栅格堆栈聚合为 8 天的总和,同时考虑一年。让我用一些代码来说明。正常的连续每日数据如下所示:

> seq.Date(as.Date("2001-11-01"), as.Date("2002-01-31"),by=1)
 [1] "2001-11-01" "2001-11-02" "2001-11-03" "2001-11-04" "2001-11-05" "2001-11-06" "2001-11-07"
 [8] "2001-11-08" "2001-11-09" "2001-11-10" "2001-11-11" "2001-11-12" "2001-11-13" "2001-11-14"
[15] "2001-11-15" "2001-11-16" "2001-11-17" "2001-11-18" "2001-11-19" "2001-11-20" "2001-11-21"
[22] "2001-11-22" "2001-11-23" "2001-11-24" "2001-11-25" "2001-11-26" "2001-11-27" "2001-11-28"
[29] "2001-11-29" "2001-11-30" "2001-12-01" "2001-12-02" "2001-12-03" "2001-12-04" "2001-12-05"
[36] "2001-12-06" "2001-12-07" "2001-12-08" "2001-12-09" "2001-12-10" "2001-12-11" "2001-12-12"
[43] "2001-12-13" "2001-12-14" "2001-12-15" "2001-12-16" "2001-12-17" "2001-12-18" "2001-12-19"
[50] "2001-12-20" "2001-12-21" "2001-12-22" "2001-12-23" "2001-12-24" "2001-12-25" "2001-12-26"
[57] "2001-12-27" "2001-12-28" "2001-12-29" "2001-12-30" "2001-12-31" "2002-01-01" "2002-01-02"
[64] "2002-01-03" "2002-01-04" "2002-01-05" "2002-01-06" "2002-01-07" "2002-01-08" "2002-01-09"
[71] "2002-01-10" "2002-01-11" "2002-01-12" "2002-01-13" "2002-01-14" "2002-01-15" "2002-01-16"
[78] "2002-01-17" "2002-01-18" "2002-01-19" "2002-01-20" "2002-01-21" "2002-01-22" "2002-01-23"
[85] "2002-01-24" "2002-01-25" "2002-01-26" "2002-01-27" "2002-01-28" "2002-01-29" "2002-01-30"
[92] "2002-01-31"

如果我将这些每日值按 8 天间隔排序,结果如下:

> seq.Date(as.Date("2001-11-01"), as.Date("2002-01-31"),by=8)
 [1] "2001-11-01" "2001-11-09" "2001-11-17" "2001-11-25" "2001-12-03" "2001-12-11" "2001-12-19"
 [8] "2001-12-27" "2002-01-04" "2002-01-12" "2002-01-20" "2002-01-28"

就像从一个月到下一个月一样,它会延续到下一年(每个月都可以)。这只是问题的一部分,因为我希望最终产品成为我可以在 StackApply 中使用的索引。因此,以上面 8 天为例,索引应该如下所示:

> rep(1:12,times=c(8,8,8,8,8,8,8,5,8,8,8,7))
 [1]  1  1  1  1  1  1  1  1  2  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3  4  4  4  4  4  4  4
[32]  4  5  5  5  5  5  5  5  5  6  6  6  6  6  6  6  6  7  7  7  7  7  7  7  7  8  8  8  8  8  9
[63]  9  9  9  9  9  9  9 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12

注意命令中间的 5,它表示它在 2001 年 12 月 31 日停止并且不会返回到 2002 年。总之,我想创建一个索引,该索引对于每个 8 天的时间间隔都有一个整数全年,但不会延续到下一年。我有一个包含 20 多年每日数据的栅格堆栈,因此这将是一个非常长的索引。

提前感谢您的帮助!

【问题讨论】:

  • lubridate::yday()%% 8 结合起来可以解决您的问题吗?
  • 你的意思是lubridate::yday(x = seq.Date(as.Date("2001-11-01"), as.Date("2002-01-31"),by=1)) %% 8?输出很接近,但与索引不完全一致。
  • dat <- seq.Date(as.Date("2001-11-01"), as.Date("2002-01-31"),by=1); ref <- seq.Date(as.Date("2001-11-01"), as.Date("2002-01-31"),by=8); out <- sapply(dat,function(x){sum(x - ref >=0)}) 真的很接近,但我不确定你为什么要 2002-01-012002-01-04 当其他一切都下降时。

标签: r indexing raster r-raster


【解决方案1】:

也许有点解决方法,但这应该可行:

library(dplyr)
library(lubridate)
df <- data.frame(date = seq.Date(as.Date("2000-01-01"), as.Date("2010-12-31"), "day"))

df %>% 
  mutate(year = year(date)) %>% 
  group_by(year) %>% 
  mutate(index = rep(seq_along(df$date), each = 8)[1:max(yday(date))]) %>% 
  ungroup() %>% 
  mutate(index = index + 46 * (year - min(year)))

【讨论】:

  • 欢迎您。顺便说一句,刚刚意识到这仅在您没有丢失日期并且每年从 1 月 1 日开始到 12 月 31 日结束的情况下才有效。这段代码当然可以针对更一般的情况进行修改。
  • 你是对的。我也意识到,我没有筛选所有数据点的缺失值,因为 8 天的时间间隔似乎大体一致。至于日期,它们确实从 1 月 1 日开始,到 12 月 31 日结束,但正如你所说,我可以修改脚本。 @Lennyy,也许您可​​以编辑您的答案,以便它反映这些其他情况,以防有人遇到略有不同但总体相似的问题?
猜你喜欢
  • 2021-05-23
  • 2018-07-01
  • 2020-05-02
  • 2020-01-31
  • 2021-07-08
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多