R在POSIXlt日期序列中标记多个日期期间

Posted

技术标签:

【中文标题】R在POSIXlt日期序列中标记多个日期期间【英文标题】:R Labeling multiple date periods in a POSIXlt date sequence 【发布时间】:2016-07-25 17:43:58 【问题描述】:

我在 R 工作。我有一个日期序列,我想指定每个特定日期是学期时间还是学校假期。我计划使用数据框列来执行此操作,其中每一行都标记为“假日”或“学期”

我的方法是创建一个时间序列并使用向量单独指定每个假期日期;第一个元素是假期的开始日期,第二个元素是假期的结束日期。

然后我创建一个 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 很陌生,我正在考虑替代方案,例如为学期和假期创建一组单独的序列,然后将它们拼接在一起。然而,这种方法似乎很繁琐,但会感谢您的想法。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您可以使用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)

【讨论】:

感谢您的回答,看来此解决方案将日期序列拆分为每个术语,然后计算分钟数。然后我怎么能将这些信息输入到数据框中? 该表只是为了表明cut 已经工作。你想在 data.frame 中输入什么?【参考方案2】:

避免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)

【讨论】:

感谢您的回答,它工作得很好,但是假期的最后一天仍然标记为学期。我尝试用 您可以将date_table$Time &lt; H[i,2] 更改为date_table$Time &lt; as.POSIXlt(H[i,2])+86400,这实际上增加了额外的一天,或者您可以将额外的一天添加到您的假期向量中。 嗨,很抱歉再次打扰您,但我想知道您是否知道一种从数据框中完全删除行而不是添加标签的方法?我尝试使用此解决方案 [link] (***.com/questions/6650510/…) 并使用 !data_table$Time 但这不起作用。您有解决方案或知道我在哪里可以找到它吗?谢谢 您要删除哪一行?你的问题不清楚。有几种方法可以索引行 (r-tutor.com/r-introduction/data-frame/data-frame-row-slice) 您好,感谢您的回答。我终于找到了删除行的解决方案:这就是我想要实现的目标:for (i in 1:nrow(H)) date_table &lt;- date_table[!(date_table$Time &gt; H[i,1] &amp; date_table$Time &lt; as.POSIXlt(H[i,2])+86400),]

以上是关于R在POSIXlt日期序列中标记多个日期期间的主要内容,如果未能解决你的问题,请参考以下文章

如何从/到日期减去/添加天数?

如何在 sql DB2 中使用条件其他字段和期间日期标记列?

比较 POSIXlt 对象和日期字符串是不是正确?

如果日期介于第二个数据帧中的两个日期之间,则 r 标记第一个数据帧中的行

jQuery Datepicker,选择多个日期并在选择时通过css标记它们,永久

SQL Server 日期比较问题