R strptime Дата понедельника с номера недели странно

Я делаю тривиальную ошибку здесь, но не могу понять, в чем проблема.

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

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"

заранее спасибо


person juhariis    schedule 19.11.2016    source источник
comment
Не совсем ясно, какую именно дату вы хотите для данной даты, но, возможно, это поможет: d <- as.Date("2013-11-05"); d - as.numeric(format(d, "%w")) + 1   -  person G. Grothendieck    schedule 19.11.2016
comment
Обратите внимание, что %V согласно ?strpitime равно Accepted but ignored on input. Вместо этого используйте %W.   -  person nicola    schedule 19.11.2016


Ответы (1)


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

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() из в любое время является необязательным, но удобным, поскольку теперь вы можете использовать множество различных форматов ввода:

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> 

Ключевым моментом, опять же, является работа с правильными классами Date и/или POSIXt в R, которые почти всегда дают вам то, что нужно — в данном случае компонент wday для дня недели. нужно вернуться к понедельнику недели.

person Dirk Eddelbuettel    schedule 19.11.2016