我有一个年周格式的字符串,如下所示:
weeks.strings <- c("2002-26", "2002-27", "2002-28", "2002-29", "2002-30", "2002-31")
但是,将此字符转换为Date类会导致丢失星期标识符:
> as.Date(weeks.strings, format="%Y-%U")
[1] "2002-08-28" "2002-08-28" "2002-08-28" "2002-08-28" "2002-08-28"
[6] "2002-08-28"
如上所示,格式转换为与今天日期连接的年份,因此有关原始周的任何信息都将丢失(例如,使用格式函数或strptime尝试强制恢复原始格式。
我在帮助组中找到的一个解决方案是指定星期几:
as.Date(weeks.strings, format="%Y-%u %U")
[1] "2002-02-12" "2002-02-19" "2002-02-26" "2002-03-05" "2002-01-02"
[6] "2002-01-09"
但看起来这会导致不正确的周编号(与原始字符串不匹配)。
任何指导都将不胜感激。
答案 0 :(得分:10)
您只需要在weeks.strings
添加工作日,以使日期明确无误(改编自Jim Holtman's answer on R-help)。
as.Date(paste(weeks.strings,1),"%Y-%U %u")
正如评论中所指出的,如果日期跨越很长的时间范围,则Date类不合适,因为 - 在某些时候 - 所选的工作日将不会存在于该年的第一周/最后一周。在这种情况下,您可以使用数字向量,其中整个部分是年份,小数部分是周/年的分数。例如:
wkstr <- sprintf("%d-%02d", rep(2000:2012,each=53), 0:52)
yrwk <- lapply(strsplit(wkstr, "-"), as.numeric)
yrwk <- sapply(yrwk, function(x) x[1]+x[2]/53)
答案 1 :(得分:4)
显然,没有独特的解决方案,因为每周最多可以由7个不同的日期表示。也就是说,这是一个想法:
weeks.strings <- c("2002-26", "2002-27", "2002-28", "2002-29",
"2002-30", "2002-31")
x <- as.Date("2002-1-1", format="%Y-%m-%d") + (0:52*7)
x[match(weeks.strings, format(x, "%Y-%U"))]
# [1] "2002-07-02" "2002-07-09" "2002-07-16" "2002-07-23"
# [5] "2002-07-30" "2002-08-06"