2016-11-19 14 views
0

Я делаю здесь тривиальную ошибку, но не могу понять, в чем проблема.R strptime Понедельник date from weeknumber weird

мне нужно получить дату понедельника недели случайного дня .. Кажется, я получаю что-то совсем другое

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 (format (d, "% w")) + 1' –

+0

Посмотрите, что '% V' в соответствии с'? strpitime' является 'Accepted, но игнорируется при вводе'. Вместо этого используйте '% W'. – nicola

ответ

3

комментарий Габора все, что нужно, по существу. Вот полная функция:

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> 

ключевой момент, еще раз, это ж ork с соответствующими Date и/или POSIXt классами в R, которые почти всегда дают вам то, что необходимо - в этом случае компонент wday для дня недели должен вернуться к понедельнику недели.