Получить месяц от недели года - PullRequest
3 голосов
/ 05 марта 2019

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

ex <- c('2012-41')

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

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

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

Ответы [ 3 ]

3 голосов
/ 05 марта 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

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

1 голос
/ 05 марта 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
0 голосов
/ 05 марта 2019

Следующее добавит неделю года к вводу строк в формате год-неделя и вернет вектор дат в виде символа. Функция lubridate package days () добавит даты, соответствующие концу соответствующей недели. Обратите внимание, например, что я добавил дополнительный регистр в вашей переменной '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
...