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

How to Create ID Variable based on Rolling Date Rule?

这很尴尬:我承认我的几段代码具有与此类似的结构:

啊啊啊!真正的程序员看到这样的东西会畏缩吗?

该图应该是不言自明的: 我需要一个名为 Season 的变量,它 return 是一个基于 WEATHERDATE 列的 ID“(year-1)_(year)”。

因此,日期从“1998-06-15”到“1999-06-14”的任何行都应该return“1998-1999”在季节 ID栏。

WEATHERDATE 列只是从 1998 年 1 月 1 日到今天。

我打赌有一个 one/two 线性解决方案。我试过 zoo 软件包 但没有成功。

任何 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") 

当然,我不必每年都回来接触代码的解决方案是理想的:)

您可以使用以下一种解决方案来获得所需的输出:

data_mex$seasonId <-
  with(data_mex,
       ifelse(as.numeric(format(WEATHERDATE, '%m')) >= 6 &
                as.numeric(format(WEATHERDATE, '%d')) >= 15,
              paste(format(WEATHERDATE, '%Y'),
                    as.numeric(format(WEATHERDATE, '%Y')) + 1, sep = '-'),
              paste(as.numeric(format(WEATHERDATE, '%Y')) - 1,
                    format(WEATHERDATE, '%Y'), sep = '-')))

结果输出为:

head(data_mex)
  WEATHERDATE    VARIABLE  seasonId
1  1998-01-01 -0.02541724 1997-1998
2  1998-01-02 -0.48725913 1997-1998
3  1998-01-03  0.06204881 1997-1998
4  1998-01-04 -0.15207281 1997-1998
5  1998-01-05 -0.61809248 1997-1998
6  1998-01-06 -1.20427734 1997-1998

tail(data_mex)
      WEATHERDATE   VARIABLE  seasonId
99994  2271-10-10 -0.8976144 2271-2272
99995  2271-10-11 -0.5684972 2271-2272
99996  2271-10-12 -0.8847031 2271-2272
99997  2271-10-13 -0.2659979 2271-2272
99998  2271-10-14 -0.9108352 2271-2272
99999  2271-10-15  1.1601581 2271-2272

您每次都提取年份部分,并根据月份和日期值粘贴滞后或领先的年份。 format 方法允许您提取日期的特定部分。

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

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)

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

这个returns:

> 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