如何根据日期范围为季节创建新列?

时间:2018-03-06 21:21:03

标签: r for-loop dataframe character

#make a horrible data frame:

ottawadates <- as.Date(c("2016-08-04", "2016-09-03", "2016-02-15", "2016-03-29, "2016-09-27"))
othervariable <- c(1, 2, 4, 5, 6)
df = data.frame(othervariable, ottawadates)

好的,所以我想做的就是创建一个名为'season'的新领域。我想使用日期范围来指示哪些日期属于相应的季节。为了清楚起见,我的实际数据集具有正确日期格式的日期,因此我猜测索引日期范围相当简单。

即。 12月21日 - 3月19日是冬天。      3月20日 - 6月20日是SPRING      6月21日 - 9月21日是夏天      9月23日 - 12月20日是FALL

我觉得这是一个for循环工作,但我太新手了解如何去做。

感谢。我很感激!

1 个答案:

答案 0 :(得分:1)

您可以使用lubridateifelse根据日期范围查找季节。假设季节为WinterOther season,则一种方法可以是:

#data
ottawadates <- as.Date(c("2016-08-04", "2016-09-03", "2016-02-15"))
othervariable <- c(1, 2, 4)
df = data.frame(othervariable, ottawadates)

library(lubridate)
df$ottawadates <- ymd(df$ottawadates)

#Evaluate season
df$season <- ifelse((month(df$ottawadates) %in% c(1, 2)) |
                  (month(df$ottawadates) == 12L & day(df$ottawadates) >= 21L) |
                  (month(df$ottawadates) == 3L & day(df$ottawadates) <= 19L),
                  "Winter", 
                  ifelse( (month(df$ottawadates) %in% c(4, 5)) |
                  (month(df$ottawadates) == 3L & day(df$ottawadates) >= 20L) |
                  (month(df$ottawadates) == 6L & day(df$ottawadates) <= 20L),
                   "Spring",
                   ifelse( (month(df$ottawadates) %in% c(7, 8)) |
                           (month(df$ottawadates) == 6L & day(df$ottawadates) >= 21L) |
                           (month(df$ottawadates) == 9L & day(df$ottawadates) <= 21L),
                           "Summer", "Fall")))


df
#  othervariable ottawadates  season
#1             1  2016-08-04  Summer
#2             2  2016-09-03  Summer
#3             4  2016-02-15  Winter