2015-03-25 3 views
3

У меня есть год, неделя ISO и будний день (год 2015, неделя 7, день недели 1 == 2015-02-09), и я бы хотел конвертировать это к дате.R: Неверное преобразование ISO-недели на дату

Так что я сделать это следующим образом:

date <- "2015:7:1" 

as.Date(date, format="%Y:%V:%u") 
[1] "2015-03-25" 

Как вы можете видеть, что я получаю неправильную дату (это сегодня). При использовании другой форматированной строки (% U или% W вместо% V) я получаю «2015-02-16» в результате - через одну неделю слишком поздно, потому что% U и% W подсчитывают недели от 0 до.

Что мне не хватает в% V?

+0

Если вы желаете использовать 'library (lubridate)' решение is 'ymd (date)' –

+0

@dimitris_ps Нет, это неправильно. Ymd (date) получает «2015-07-01 UTC» – JerryWho

+2

@dimitris_ps Нет, вы пропустил, что вторым номером является isoweek, а не месяц. Последний номер - это день недели, а не день месяца. – JerryWho

ответ

3

Проблема в том, что вы можете использовать %V для вывода, но не для ввода. Обратите внимание на ? strptime:

% V: Неделя года как десятичное число (01-53), как определено в ISO 8601. Если неделя (начиная с понедельника), содержащей 1 января имеет четыре или более дней в новый год, то это считается неделя 1. в противном случае, это последняя неделя предыдущего года, а следующая неделя 1. (Принято, но игнорируется на входе.)

Таким образом, это означает вы, вероятно, должны использовать %W и вычесть неделю:

as.Date("2015:7:1", format = "%Y:%W:%u") - 7 
[1] "2015-02-09" 

А затем обратите внимание, как %V допускается на выходе:

strftime(as.Date("2015:7:1", format = "%Y:%W:%u") - 7, "%Y:%V:%u") 
[1] "2015:07:1" 
+0

Мне следовало бы прочитать всю справочную страницу ;-) Спасибо! Решение, которое вы предлагаете, - это именно то, что я использую сейчас. – JerryWho

0

Я хотел бы предостеречь. Предложенный способ вычисления не всегда работает, как и должно быть, к примеру:

isoyear = c(2015, 2015) 
isoweek = c(52, 53) 
iyw=paste(isoyear,isoweek,1,sep=":") 
as.Date(iyw, format = "%Y:%W:%u") - 7 
[1] "2015-12-21" NA 

но если мы проверим isoweek из «2015-12-31», мы получим следующее:

isoweek("2015-12-28") 
[1] 53 

Вместо этого лучше использовать функцию ISOweek2date() из пакета ISOweek.