从一年中的第几周获取月份
Get the month from the week of the year
假设我们有这个:
ex <- c('2012-41')
这代表 2012 年的第 41 周。我如何从中得到月份?
由于一周可以介于两个月之间,因此我很想知道该周开始的月份(此处为 10 月)。
与 How to extract Month from date in R 不重复(没有像 %Y-%m-%d 这样的标准日期格式)。
以下将把一年中的星期添加到年-星期格式化字符串的输入中,return 将日期向量作为字符添加到输入中。 lubridate 包 weeks() 函数将添加与相关周结束相对应的日期。请注意,例如,我在第 52 周的 'ex' 变量中添加了一个案例,它 returns Dec-31st
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
这取决于周的定义。请参阅 ?strptime
中对 %V
和 %W
的讨论,了解周的两种可能定义。我们在下面使用 %V
,但如果需要,该函数允许一个指定另一个。该函数对 x
的元素执行 sapply
,对于每个这样的元素,它将年份提取到 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
你可以试试:
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
希望对您有所帮助!
假设我们有这个:
ex <- c('2012-41')
这代表 2012 年的第 41 周。我如何从中得到月份?
由于一周可以介于两个月之间,因此我很想知道该周开始的月份(此处为 10 月)。
与 How to extract Month from date in R 不重复(没有像 %Y-%m-%d 这样的标准日期格式)。
以下将把一年中的星期添加到年-星期格式化字符串的输入中,return 将日期向量作为字符添加到输入中。 lubridate 包 weeks() 函数将添加与相关周结束相对应的日期。请注意,例如,我在第 52 周的 'ex' 变量中添加了一个案例,它 returns Dec-31st
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
这取决于周的定义。请参阅 ?strptime
中对 %V
和 %W
的讨论,了解周的两种可能定义。我们在下面使用 %V
,但如果需要,该函数允许一个指定另一个。该函数对 x
的元素执行 sapply
,对于每个这样的元素,它将年份提取到 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
你可以试试:
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
希望对您有所帮助!