R strptime星期一日期从周数奇怪

时间:2016-11-19 18:23:19

标签: r iso8601 strptime date-conversion week-number

我在这里犯了一个微不足道的错误,但无法弄清楚是什么问题。

我需要得到一个随机日期的星期一的日期..似乎我得到了一些完全不同的东西

mydate <- date("2013-11-05")

format(mydate, "%A")           # this is Tuesday, right
#[1] "Tuesday"
month(mydate)                  # Month November, right
#[1] 11
myyr <- year(mydate); myyr     # year is 2013, right
#[1] 2013
day(mydate)                    # day number is 5, right
#[1] 5 
mywk <- isoweek(mydate);mywk   # weeknumber is 45, right (yes, not US convention here)
#[1] 45
format(mydate, "%V")           # weeknumber is 45, right as well
#[1] "45" 
# Monday of week 45 is 2013-11-04 but strptime following gives something else...

strptime(paste0(myyr, "Monday", mywk), "%Y%A%V")
#[1] "2013-11-19 EET" 
# and for checking

strptime("2013Monday45","%Y%A%V")
#[1] "2013-11-19 EET"

提前致谢

1 个答案:

答案 0 :(得分:4)

Gabor的评论就是你所需要的。这是一个完整的功能:

mondayForGivenDate <- function(d) { 
    if (class(d) != "Date") d <- anytime::anydate(d)
    d - as.POSIXlt(d)$wday + 1
}

今天(星期六),下周一和上周六运行这个会给我们带来三个不同的星期一&#39;如你所愿:

R> mondayForGivenDate(Sys.Date())
[1] "2016-11-14"
R> mondayForGivenDate(Sys.Date()+2)
[1] "2016-11-21"
R> mondayForGivenDate(Sys.Date()-7)
[1] "2016-11-07"
R> 

使用anytime中的anydate()函数是可选的,但很好,因为您现在可以使用许多不同的输入格式:

R> mondayForGivenDate(20161119)
[1] "2016-11-14"
R> mondayForGivenDate("20161119")
[1] "2016-11-14"
R> mondayForGivenDate("2016-11-19")
[1] "2016-11-14"
R> mondayForGivenDate("2016-Nov-19")
[1] "2016-11-14"
R> 

重点是,使用R 中正确的Date和/或POSIXt类来完成,这几乎总能为您提供所需的内容 - 在这种情况下,星期几的wday组件需要恢复到星期一的星期。