Преобразовать год / неделю на текущий объект

String содержит «YEAR WEEK», и я хочу преобразовать его с помощью parse_date_time() в объект даты, но я не могу заставить код работать:

 parse_date_time(c("201510"), "YW") 

Мне не нужно использовать lubridate , могут быть и другие пакеты.

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

strptime() base R strptime() знает 3 определения для недели года (но поддерживает только 2 из них на входе) и 2 определения для числа дней недели, см. ?strptime :

Неделя года

  • Конвенция США : неделя года в виде десятичного числа (00-53), использующая воскресенье в качестве первого дня 1 недели (и, как правило, с первым воскресеньем года как день 1 недели 1): %U

  • Британская конвенция : неделя года в виде десятичного числа (00-53) с понедельника в качестве первого дня недели (и обычно с первого понедельника года как день 1 недели 1): %W

  • Определение ISO 8601 : неделя года как десятичное число (01-53), как определено в ISO 8601. Если неделя (начиная с понедельника), содержащая 1 января, имеет четыре или более дней в новом году, то считается 1-й неделей. В противном случае это последняя неделя предыдущего года, а на следующей неделе – неделя 1: %V которая принимается, но игнорируется при вводе.
    Обратите внимание, что существует также недельный год ( %G и %g ), который должен использоваться с %V как он может отличаться от календарного года ( %Y и %y ).

Число дней в неделю

  • День недели как десятичное число (1-7, понедельник – 1): %u
  • День недели как десятичное число (0-6, воскресенье равно 0): %w
  • Интересно, что нет формата для случая, когда воскресенье считается как день 1 недели.

Преобразование года в неделю с различными соглашениями

Если мы добавим 1-й день в строку и используем разные форматы, которые мы получаем

 as.Date("2015101", "%Y%U%u") # [1] "2015-03-09" as.Date("2015101", "%Y%U%w") # [1] "2015-03-09" as.Date("2015101", "%Y%W%u") # [1] "2015-03-09" as.Date("2015101", "%Y%W%w") # [1] "2015-03-09" as.Date("2015101", "%G%V%u") # [1] NA 

Для форматов дней недели %u и %w мы получаем тот же результат, потому что 1-й день – понедельник в обеих соглашениях (но следите за тем, чтобы иметь дело с воскресеньями).

В 2015 году определение США и Великобритании в течение недели года совпадает, но это неверно на протяжении всех лет, например, не на 2001, 2007 и 2018 годы:

 as.Date("2018101", "%Y%U%u") #[1] "2018-03-12" as.Date("2018101", "%Y%W%u") #[1] "2018-03-05" 

Спецификаторы формата ISO 8601 не поддерживаются на входе. Поэтому я создал пакет ISOweek несколько лет назад:

 ISOweek::ISOweek2date("2015-W10-1") #[1] "2015-03-02" 

Изменить: использовать четверг, чтобы связать неделю с месяцем

Как указано выше, вам нужно указать день недели, чтобы получить полную календарную дату. Это также необходимо, если даты должны быть агрегированы к месяцу позже.

Если день недели не указан, и если даты должны быть агрегированы по месяцам позже, вы можете взять четверг каждую неделю в качестве контрольного дня (после предложения djhurio ). Это гарантирует, что целая неделя будет назначена на месяц, к которому принадлежит большинство дней недели.

Например, возrotation воскресенья в качестве ссылочного дня

 ISOweek::ISOweek2date("2015-W09-7") 
 [1] "2015-03-01" 

который, следовательно, свяжет всю неделю с мартом, хотя только один день недели относится к марту, а остальные 6 дней относятся к февралю. В четверг в качестве контрольного дня будет возвращена дата в феврале:

 ISOweek::ISOweek2date("2015-W09-4") 
 [1] "2015-02-26" 
  • ggplot2: фигурные скобки на оси?
  • Построить ручную легенду для сложного сюжета
  • R: Как GeoCode простой адрес с помощью Data Science Toolbox
  • Кривая кривой полинома в R
  • R / regex with stringi / ICU: почему символ «+» считается символом non - ?
  • Выберите группы с более чем одним отдельным значением
  • Преобразование числового представления столбца «переменная» в исходную строку после таяния с использованием шаблонов
  • Почему я получаю X. в именах столбцов при чтении фрейма данных?
  • Сгенерировать фиктивную переменную
  • Есть ли dplyr эквивалент data.table :: rleid?
  • Объединить значения в огромные XML-файлы
  • Давайте будем гением компьютера.