首页 > 解决方案 > 在间隔内匹配星期几以创建特定日期

问题描述

我正在使用具有以下日期结构的数据集:

Week  DateStart    DateEnd      Day
1     5-Aug-16     11-Aug-16    Monday
2     12-Aug-16    18-Aug-16    Thursday

其中“Week”对应于研究周数,“DateStart”和“DateEnd”是该周的第一天和最后一天,“Day”表示该周内的特定日期。我想使用“DateStart”、“DateEnd”和“Day”字段来创建一个新字段“Date”,它为“DateStart”和“DateEnd”内的每个“Day”分配一个特定日期间隔。

我使用 %--% 运算符将 DateStart 和 DateEnd 转换为间隔:

Week_Interval <- DateStart %--% DateEnd

但是后来我在弄清楚如何将 Day 字段与结果间隔内的日期匹配时运气不佳。我已经尝试通读 lubridate 文档,但其中似乎没有任何东西可以专门解决我的问题。我希望这里的人可能对此有一些经验,并可以帮助我指出正确的方向。

我理想的输出是这样的:

Week  DateStart    DateEnd      Day        Date
1     5-Aug-16     11-Aug-16    Monday     08-08-2016
2     12-Aug-16    18-Aug-16    Thursday   18-08-2016

日期遵循标准 dd-mm-yyyy 格式。

标签: rlubridate

解决方案


取一周中星期几DayDateStart模 7 之间的差并将其添加到DateStart.

不使用任何包。

dow <- c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
transform(DF, Date = 
  DateStart + (match(Day, dow) - 1 - as.POSIXlt(DateStart)$wday) %% 7)

给予:

  Week  DateStart    DateEnd      Day       Date
1    1 2016-08-05 2016-08-11   Monday 2016-08-08
2    2 2016-08-12 2016-08-18 Thursday 2016-08-18

注1

如果您在英语语言环境中,则可以替代写出星期几:

dow <- weekdays(as.Date("1950-01-01") + 0:6)

笔记2

在示例中,两行的开始日期都是星期五。如果知道情况总是如此,我们可以通过将代码硬编码为 5 来缩短代码:

transform(DF, Date = DateStart + (match(Day, dow) - 1 - 5) %% 7)

注3

输入,以可重现的形式,是:

Lines <- "Week  DateStart    DateEnd      Day
1     5-Aug-16     11-Aug-16    Monday
2     12-Aug-16    18-Aug-16    Thursday"
DF <- read.table(text = Lines, header = TRUE)
fmt <- "%d-%b-%y"
DF <- transform(DF, DateStart = as.Date(DateStart, fmt),
  DateEnd = as.Date(DateEnd, fmt))

推荐阅读