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

时间:2016-05-06 23:46:01

标签: r time-series xts lapply zoo

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

enter image description here

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

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

因此,任何日期从“1998-06-15”到“1999-06-14”的行都应在季节 ID列下返回“1998-1999”。

WEATHERDATE列只是从1998-01-01运行到今天。

我打赌这有一个/两个班轮解决方案。我已经尝试了 zoo package 但没有成功。

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

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

2 个答案:

答案 0 :(得分:6)

您可以使用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(),或者适合您的任务。

返回:

> 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

答案 1 :(得分:1)

以下是一个可用于获得所需输出的解决方案:

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方法允许您提取日期的特定部分。