R 在 POSIXlt 日期序列中标记多个日期期间
R Labeling multiple date periods in a POSIXlt date sequence
我在 R 中工作。我有一个日期序列,我想指定每个特定日期是学期时间还是学校假期。我计划使用数据框列来执行此操作,其中每一行都标记为 "Holiday" 或 "Term"
我的方法是创建一个时间序列并使用向量单独指定每个假期日期;第一个元素是假期的开始日期,第二个元素是假期的结束日期。
然后我创建一个 if-or 语句来测试时间是否在向量中指定的任何假期日期之内。
到目前为止,这是我的代码:
start <- as.POSIXlt("2015-10-10 00:00:00")
end <- as.POSIXlt("2016-03-31 00:00:00")
DateSeq <- seq(from=start, to=end, by="mins")
#Holidays defined using a vector with by start and end date
H1 <- c("2015-10-26", "2015-11-3") #October half term
H2 <- c("2015-12-16", "2016-01-05") #Christmas holiday
H3 <- c("2016-02-15", "2016-02-19") #Feb half term
H4 <- c("2016-03-24", "2016-03-31") #Easter holiday
date_table <- data.frame(Time = DateSeq)
if ((round(date_table$Time, units = "days")== H1[1] <> H1[2]) | (round(date_table$Time, units = "days") == H2[1] <> H2[2])) {
date_table$Holiday <- "Holiday"
} else {
date_table$Holiday <- "Term"
}
如您所见,此代码不起作用,只是将所有行标记为 "Term"。
因此我想知道以下问题:
如何在假日向量中指定日期范围以便在 if 语句中使用它?
这是否是最好的使用方法?我是 R 的新手,我正在考虑替代方案,例如为学期和假期创建一组单独的序列,然后将它们拼接在一起。然而,这种方法看起来很繁琐,但会感谢您的想法。
感谢您的帮助。
您可以使用 cut()
将 DateSeq 分成学期和假期。
res <- cut(DateSeq, breaks = as.POSIXlt( c(H1, H2, H3, H4), format = "%Y-%m-%d"), labels = c("October", "term1", "Christmas", "term2", "Feb", "Term3", "Easter"))
table(res)
与您的方法类似,避免 if-else
。
# Or alternatively by="mins"
DateSeq <- seq(from=start, to=end, by="hours")
date_table <- data.frame(Time = DateSeq)
# Put all holidays together
H<-rbind(H1,H2,H3,H4)
# Or alternatively set to "Term"
date_table$Holiday<-0
# Assign all the holidays
for (i in 1:nrow(H)){
date_table[date_table$Time > H[i,1] & date_table$Time < H[i,2],"Holiday"]<-1 # or "Holiday"
}
# Check they are correctly assign
plot(date_table)
我在 R 中工作。我有一个日期序列,我想指定每个特定日期是学期时间还是学校假期。我计划使用数据框列来执行此操作,其中每一行都标记为 "Holiday" 或 "Term"
我的方法是创建一个时间序列并使用向量单独指定每个假期日期;第一个元素是假期的开始日期,第二个元素是假期的结束日期。
然后我创建一个 if-or 语句来测试时间是否在向量中指定的任何假期日期之内。
到目前为止,这是我的代码:
start <- as.POSIXlt("2015-10-10 00:00:00")
end <- as.POSIXlt("2016-03-31 00:00:00")
DateSeq <- seq(from=start, to=end, by="mins")
#Holidays defined using a vector with by start and end date
H1 <- c("2015-10-26", "2015-11-3") #October half term
H2 <- c("2015-12-16", "2016-01-05") #Christmas holiday
H3 <- c("2016-02-15", "2016-02-19") #Feb half term
H4 <- c("2016-03-24", "2016-03-31") #Easter holiday
date_table <- data.frame(Time = DateSeq)
if ((round(date_table$Time, units = "days")== H1[1] <> H1[2]) | (round(date_table$Time, units = "days") == H2[1] <> H2[2])) {
date_table$Holiday <- "Holiday"
} else {
date_table$Holiday <- "Term"
}
如您所见,此代码不起作用,只是将所有行标记为 "Term"。
因此我想知道以下问题:
如何在假日向量中指定日期范围以便在 if 语句中使用它?
这是否是最好的使用方法?我是 R 的新手,我正在考虑替代方案,例如为学期和假期创建一组单独的序列,然后将它们拼接在一起。然而,这种方法看起来很繁琐,但会感谢您的想法。
感谢您的帮助。
您可以使用 cut()
将 DateSeq 分成学期和假期。
res <- cut(DateSeq, breaks = as.POSIXlt( c(H1, H2, H3, H4), format = "%Y-%m-%d"), labels = c("October", "term1", "Christmas", "term2", "Feb", "Term3", "Easter"))
table(res)
与您的方法类似,避免 if-else
。
# Or alternatively by="mins"
DateSeq <- seq(from=start, to=end, by="hours")
date_table <- data.frame(Time = DateSeq)
# Put all holidays together
H<-rbind(H1,H2,H3,H4)
# Or alternatively set to "Term"
date_table$Holiday<-0
# Assign all the holidays
for (i in 1:nrow(H)){
date_table[date_table$Time > H[i,1] & date_table$Time < H[i,2],"Holiday"]<-1 # or "Holiday"
}
# Check they are correctly assign
plot(date_table)