R - 转换为日期格式时,周 - 年:周的字符串丢失

时间:2012-08-28 18:30:03

标签: r datetime string-formatting

我有一个年周格式的字符串,如下所示:

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"

但看起来这会导致不正确的周编号(与原始字符串不匹配)。

任何指导都将不胜感激。

2 个答案:

答案 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"