如何根据滚动日期规则创建ID变量?

Dan*_*Dan 1 r time-series lapply zoo xts

这很令人尴尬:我承认我的几段代码与此类似:

在此输入图像描述

Arghhhh!真正的程序员在看到类似的东西时会畏缩吗?

这个数字应该是不言自明的:我需要一个名为Season的变量,它根据WEATHERDATE列返回ID"(year-1)_(year)".

因此,日期从"1998-06-15"到"1999-06-14"的任何行都应在Season ID列下返回"1998-1999" .

WEATHERDATE列仅从1998-01-01运行到TODAY.

我打赌这有一个/两个班轮解决方案.我试过动物园包但没有成功.

任何R向导都指向我在这里缺少的明显解决方案?

***可重复的例子:

WEATHERDATE <- seq(as.Date("1998-01-01"), len=99999, by=1)
VARIABLE    <- rnorm(n = length(WEATHERDATE))
data_mex    <- data.frame(WEATHERDATE, VARIABLE)
## how to create SEASON based on dates??
# I would then run the code block from above, something like:
data_mex <- within(data_mex, Season[DATEWEATHER >= ymd(StartOfSeason)+365*0   & DATEWEATHER < ymd(StartOfSeason)+365*1 ] <- "1998-1999") 
Run Code Online (Sandbox Code Playgroud)

当然,我不需要每年回来并触摸代码的解决方案将是理想的:)

ajr*_*ite 6

您可以在基数R中使用cut.Dateseq.Date执行此操作:

seasons <- format(as.Date(cut.Date(as.Date(data_mex$WEATHERDATE),
               breaks=seq.Date(as.Date("1997-06-15"),
                 as.Date("2280-06-15", "year"))), "%Y")
data_mex$seasons <- paste0(seasons, "-", as.numeric(seasons) + 1)
Run Code Online (Sandbox Code Playgroud)

注意我已经将您用作"2280-06-15"季节的最新日期,但您可能希望将其替换Sys.Date()为适合您的任务或适合您的任务.

返回:

> head(data_mex)
  WEATHERDATE   VARIABLE   seasons
1  1998-01-01 -0.2260734 1997-1998
2  1998-01-02  0.3222805 1997-1998
3  1998-01-03 -0.1554167 1997-1998
4  1998-01-04 -0.5591154 1997-1998
5  1998-01-05  1.0729737 1997-1998
6  1998-01-06  1.0030025 1997-1998

> tail(data_mex)
      WEATHERDATE   VARIABLE   seasons
99994  2271-10-10 0.59986466 2271-2272
99995  2271-10-11 0.37304603 2271-2272
99996  2271-10-12 1.30822156 2271-2272
99997  2271-10-13 0.01204986 2271-2272
99998  2271-10-14 0.87340544 2271-2272
99999  2271-10-15 0.44098083 2271-2272
Run Code Online (Sandbox Code Playgroud)