R:将日期缩小到一周的第一天

时间:2017-05-05 20:25:18

标签: r

我有一个数据框,其中一列包含日期(某些日期多次出现)。我想按周汇总日期。我能想到的最好方法是将日期向下舍入到最近的星期一。我该如何舍入日期?如何将这个日期列表转换为几周?

2016-04-04
2016-04-05
2016-04-06
2016-04-07
2016-04-08
2016-04-09
2016-04-10
2016-04-11
2016-04-12
2016-04-13
2016-04-14

预期输出应为:

2016-04-04
2016-04-04
2016-04-04
2016-04-04
2016-04-04
2016-04-04
2016-04-04
2016-04-11
2016-04-11
2016-04-11
2016-04-11

3 个答案:

答案 0 :(得分:5)

使用lubridate,你可以试试这个:

library(lubridate)
dates <- seq.Date(as.Date("2016-04-04"), as.Date("2016-04-14"), by = 1)
floor_date(dates - 1, "weeks") + 1

floor_date星期日开始几周,所以为了避免在下周包含这些,你必须在四舍五入之前减去一个,然后将值增加一天。

答案 1 :(得分:5)

来自基础R的

cut()有两种方法用于类DatePOSIXt的对象,它们假设默认情况下周数从周一开始(但可以使用{{1}更改为星期日})。

start.on.monday = FALSE

请注意dates <- c("2016-04-04", "2016-04-05", "2016-04-06", "2016-04-07", "2016-04-08", "2016-04-09", "2016-04-10", "2016-04-11", "2016-04-12", "2016-04-13", "2016-04-14") result <- data.frame( dates, cut_Date = cut(as.Date(dates), "week"), cut_POSIXt = cut(as.POSIXct(dates), "week"), stringsAsFactors = FALSE) result # dates cut_Date cut_POSIXt #1 2016-04-04 2016-04-04 2016-04-04 #2 2016-04-05 2016-04-04 2016-04-04 #3 2016-04-06 2016-04-04 2016-04-04 #4 2016-04-07 2016-04-04 2016-04-04 #5 2016-04-08 2016-04-04 2016-04-04 #6 2016-04-09 2016-04-04 2016-04-04 #7 2016-04-10 2016-04-04 2016-04-04 #8 2016-04-11 2016-04-11 2016-04-11 #9 2016-04-12 2016-04-11 2016-04-11 #10 2016-04-13 2016-04-11 2016-04-11 #11 2016-04-14 2016-04-11 2016-04-11 返回OP所要求的完美聚合因子:

cut()

但是,对于使用str(result) #'data.frame': 11 obs. of 3 variables: # $ dates : chr "2016-04-04" "2016-04-05" "2016-04-06" "2016-04-07" ... # $ cut_Date : Factor w/ 2 levels "2016-04-04","2016-04-11": 1 1 1 1 1 1 1 2 2 2 ... # $ cut_POSIXt: Factor w/ 2 levels "2016-04-04","2016-04-11": 1 1 1 1 1 1 1 2 2 2 ... 绘制聚合值(如果存在大量可能会使轴混乱的周数),最好从离散时间刻度切换到连续时间刻度。然后有必要将因素强制回ggplot2Date

POSIXct

答案 2 :(得分:0)

使用week_start软件包的floor_date函数中的lubridate参数,您可以选择指定自lubridate version 1.7.0起的一周的开始。这使您可以执行:

library(lubridate)
dates <- seq.Date(as.Date("2016-04-04"), as.Date("2016-04-14"), by = 1)
floor_date(dates, "weeks", week_start = 1)

我会将其发布为对Sraffa的回应的评论,但我没有声誉。