Вопрос:

Конвертировать номер недели в дату

r as.date

16803 просмотра

3 ответа

160 Репутация автора

У меня есть фрейм данных в R с неделей года, которые я хотел бы преобразовать в дату. Я знаю, что должен выбрать год и день недели, поэтому я фиксирую эти значения в 2014 и 1. Преобразование этого в дату кажется простым:

as.Date(paste(2014,df$Week,1,sep=""),"%Y%U%u")

Но этот код работает, только если неделя больше 9. Неделя 1 - 9 возвращает NA. Если я изменю неделю на 01,02,03 ... она все равно вернет NA.

Кто-нибудь видит, чего мне не хватает?

Автор: Aaron Soderstrom Источник Размещён: 09.09.2015 03:24

Ответы (3)


22 плюса

19959 Репутация автора

Решение

as.Date вызывает от 1 до 9 как NA, так как он ожидает две цифры для номера недели и не может правильно проанализировать его.

Чтобы исправить это, добавьте немного - чтобы разделить вещи:

as.Date(paste(2014, df$Week, 1, sep="-"), "%Y-%U-%u")
Автор: jeremycg Размещён: 09.09.2015 03:27

7 плюса

6779 Репутация автора

Альтернативное решение - использовать арифметику даты из lubridateпакета:

lubridate::ymd( "2014-01-01" ) + lubridate::weeks( df$Week - 1 )

Это -1необходимо, потому что 2014-01-01уже неделя 1. Другими словами, мы хотим:

  • df$Week == 1сопоставить 2014-01-01(что есть ymd("2014-01-01") + weeks(1-1))
  • df$Week == 2сопоставить 2014-01-08(что есть ymd("2014-01-01") + weeks(2-1))
  • и так далее.
Автор: Artem Sokolov Размещён: 12.09.2017 06:43

0 плюса

1 Репутация автора

It will be like using 2nd year = (week-52), 3rd year  = (week -104)...so on

for(i in 1:456548)
{
  if (train[i,2] > 0 & train[i,2] <53)
  {
    train["weekdate"] <- as.Date(paste(2016, train$week, 1, sep="-"), "%Y-%U-%u")
  }
  if (train[i,2] > 52 & train[i,2] <105)
  {
    train["weekdate"] <- as.Date(paste(2017, (train$week-52), 1, sep="-"), "%Y-%U-%u")
  }
  if (train[i,2] > 104 & train[i,2] <150)
  {
    train["weekdate"] <- as.Date(paste(2018, (train$week-104), 1, sep="-"), "%Y-%U-%u")
  }

}
Автор: user2640679 Размещён: 15.12.2018 06:04
Вопросы из категории :
32x32