5

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

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"

如上所示,格式被转换为与今天日期连接的年份,因此有关原始星期的任何信息都将丢失(例如,当使用 format 函数或 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"

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

任何指导将不胜感激。

4

2 回答 2

10

您只需要在您的工作日中添加一个工作日以weeks.strings使日期明确(改编自Jim Holtman 对 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)
于 2012-08-28T19:16:21.487 回答
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"
于 2012-08-28T18:47:00.167 回答