Проблема в том, что для %u
1
– это Monday
, а 7
– Sunday
недели. Проблема еще более усложняется тем фактом, что %U
предполагает, что неделя начинается в воскресенье.
Для данного ввода и ожидаемого поведения format = "%Y-%U-%u"
вывод строки 4 согласуется с выводом предыдущих 3 строк.
То есть, если вы хотите использовать format = "%Y-%U-%u"
, вы должны предварительно обработать свой ввод. В этом случае четвертая строка должна быть as.Date("2016-51-7", format = "%Y-%U-%u")
, как показывает
format(as.Date("2016-12-18"), "%Y-%U-%u")
# "2016-51-7"
Вместо этого вы сейчас проходите "2016-50-7"
.
Лучшим способом сделать это может быть использование подхода, предложенного в ответе Уве Блока. Поскольку вы довольны преобразованием "2016-50-4"
в "2016-12-15"
, я подозреваю, что в ваших необработанных данных понедельник тоже считается 1
. Вы также можете создать пользовательскую функцию, которая изменяет значение %U
для подсчета номера недели, как если бы неделя начиналась в понедельник, чтобы результат был таким, как вы ожидали.
#Function to change value of %U so that the week begins on Monday
pre_process = function(x, delim = "-"){
y = unlist(strsplit(x,delim))
# If the last day of the year is 7 (Sunday for %u),
# add 1 to the week to make it the week 00 of the next year
# I think there might be a better solution for this
if (y[2] == "53" & y[3] == "7"){
x = paste(as.integer(y[1])+1,"00",y[3],sep = delim)
} else if (y[3] == "7"){
# If the day is 7 (Sunday for %u), add 1 to the week
x = paste(y[1],as.integer(y[2])+1,y[3],sep = delim)
}
return(x)
}
И использование будет
as.Date(pre_process("2016-50-7"), format = "%Y-%U-%u")
# [1] "2016-12-18"
Я не совсем понимаю, что делать, если год заканчивается в воскресенье.
person
d.b
schedule
18.01.2017
as.Date("2016-50-7", format = "%Y-%U-%u")
интерпретируется как первый день (воскресенье) недели 50. См.?strptime
для проверки. - person lmo   schedule 18.01.2017as.Date("2016-50-7", format = "%Y-%V-%u")
, похоже, работает, но в течение нескольких лет будет давать результаты, отличные от вашего примера - насколько это важно, может зависеть от вашего приложения - person Miff   schedule 18.01.2017"2016-01-18"
, что не является правильной датой - person Jaap   schedule 18.01.2017as.Date("2016-50-7", format = "%Y-%U-%u")
интерпретируется как седьмой день (воскресенье) 50-й недели. - person d.b   schedule 18.01.2017