我有一个数据框,其中一列包含日期(某些日期多次出现)。我想按周汇总日期。我能想到的最好方法是将日期向下舍入到最近的星期一。我该如何舍入日期?如何将这个日期列表转换为几周?
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
答案 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)
cut()
有两种方法用于类Date
和POSIXt
的对象,它们假设默认情况下周数从周一开始(但可以使用{{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 ...
绘制聚合值(如果存在大量可能会使轴混乱的周数),最好从离散时间刻度切换到连续时间刻度。然后有必要将因素强制回ggplot2
或Date
:
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的回应的评论,但我没有声誉。