2016-11-19 41 views
0

我在這裏犯了一個微不足道的錯誤,但無法弄清楚問題是什麼。R strptime星期一從weeknumber怪異的日期

我需要得到一個隨機日期的周的星期一的日期..看來我得到的東西完全不同

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" 

在此先感謝

+2

不清楚你想要給定日期的日期,但這可能會有所幫助:'d < - as.Date(「2013-11-05」); d - as.numeric(格式(d,「%w」))+ 1' –

+0

根據'?strpitime'看到'%V'是'Accepted,but input on input'。改用'%W'。 – nicola

回答

3

的Gabor的評論是你所需要的,本質。這裏是一個全功能:

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

今天運行此(星期六),下週一和以前的週六讓我們動三種不同的週一爲您期望:

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> 

從使用anydate()功能該anytime是可選的,但不錯的,因爲你現在得到使用許多不同的輸入格式:

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> 

關鍵點,再次,是爲w ORK 與適當的Date和/或POSIXt類在R幾乎總是給你所需要的 - 在這種情況下,一週中的日子wday組件需要恢復到星期一的星期一。