Получить месяц из недели года

Допустим, у нас есть это:

ex <- c('2012-41')

Это представляет неделю 41 с 2012 года. Как я могу получить месяц от этого?

Поскольку неделя может быть между двумя месяцами, мне будет интересно узнать месяц начала этой недели (здесь октябрь).

Не дублировать Как извлечь месяц из даты в R ( не имеют стандартного формата даты, такого как %Y-%m-%d).


person Andrei Niță    schedule 05.03.2019    source источник
comment
Попробуйте format(as.Date(ex, "%Y-%W"), "%m")   -  person akrun    schedule 05.03.2019
comment
Может быть, неделя между двумя месяцами   -  person LocoGris    schedule 05.03.2019
comment
Это не совсем так, потому что одна неделя может приходиться на два разных месяца (прошлая неделя, например, началась 24 февраля (воскресенье) и закончилась 02 марта)   -  person Iago Carvalho    schedule 05.03.2019
comment
Спасибо большое. На самом деле я хотел сделать столбец в кадре данных с месяцем, чтобы сделать правильный ggplot с осью x в качестве даты. Я агрегировал данные от ежедневных до ежемесячных, используя формат (tt $ date, % Y-% V). Я изменю пример   -  person Andrei Niță    schedule 05.03.2019
comment
Возможный дубликат Как извлечь месяц из даты в R   -  person divibisan    schedule 05.03.2019
comment
Возможный дубликат Как разобрать год + номер недели в R?   -  person divibisan    schedule 05.03.2019
comment
^ Объедините эти 2 дубликата, чтобы получить ответ.   -  person divibisan    schedule 05.03.2019
comment
@dww Хорошая идея, но она не работает. Результатом этого кода является 3, то есть март, вместо 10 для октября.   -  person RHertel    schedule 06.03.2019


Ответы (3)


Следующее добавит неделю года к вводу отформатированных строк года-недели и вернет вектор дат в качестве символа. Функция lubridate package week() добавит даты, соответствующие концу соответствующей недели. Обратите внимание, например, я добавил дополнительный случай в вашу переменную «ex» к 52-й неделе, и он возвращает 31 декабря.

library(lubridate)

ex <- c('2012-41','2016-4','2018-52')

dates <- strsplit(ex,"-")
dates <- sapply(dates,function(x) {
  year_week <- unlist(x)
  year <- year_week[1]
  week <- year_week[2]
  start_date <- as.Date(paste0(year,'-01-01'))
  date <- start_date+weeks(week)
  #note here: OP asked for beginning of week.  
  #There's some ambiguity here, the above is end-of-week; 
  #uncommment here for beginning of week, just subtracted 6 days.  
  #I think this might yield inconsistent results, especially year-boundaries
  #hence suggestion to use end of week.  See below for possible solution
  #date <- start_date+weeks(week)-days(6)

  return (as.character(date))
})

Урожайность:

> dates
[1] "2012-10-14" "2016-01-29" "2018-12-31"

И просто получить месяц из этих полных дат:

month(dates)

Урожайность:

> month(dates)
[1] 10  1 12
person Soren    schedule 05.03.2019

вы можете попробовать:

ex <- c('2019-10')

splitDate <- strsplit(ex, "-")

dateNew <- as.Date(paste(splitDate[[1]][1], splitDate[[1]][2], 1, sep="-"), "%Y-%U-%u")

monthSelected <- lubridate::month(dateNew)

3

Надеюсь, это поможет!

person Raul Guerrero    schedule 05.03.2019
comment
Можно записать так: as.numeric(format(as.Date(paste0(ex, "-1"), "%Y-%U-%u"), "%m")) - person G. Grothendieck; 05.03.2019
comment
Можно даже обернуть это в month.name[] - person RHertel; 06.03.2019

Это зависит от определения недели. См. обсуждение %V и %W в ?strptime для двух возможных определений недели. Мы используем %V ниже, но функция позволяет при желании указать другое. Функция выполняет sapply над элементами x и для каждого такого элемента извлекает год в yr и формирует последовательность всех дат этого года в sq. Затем он преобразует эти даты в год-месяц и находит первое вхождение текущего компонента x в этой последовательности, наконец, извлекая месяц совпадения.

yw2m <- function(x, fmt = "%Y-%V") {
  sapply(x, function(x) {
    yr <- as.numeric(substr(x, 1, 4))
    sq <- seq(as.Date(paste0(yr, "-01-01")), as.Date(paste0(yr, "-12-31")), "day")
    as.numeric(format(sq[which.max(format(sq, fmt) == x)], "%m"))
  })
}

yw2m('2012-41')
## [1] 10
person G. Grothendieck    schedule 05.03.2019