[英]Get the number of the month in the year by the number of week
我有一列中有一年的星期数:
> merged.tables_d[,"Promo2SinceWeek"]
Promo2SinceWeek
1: NA
2: NA
3: NA
4: NA
5: NA
---
1017205: 22
1017206: 22
1017207: 22
1017208: 22
1017209: 22
例如,值22
应该是一年中的第5
个月。 所以结果应该是这样的:
> merged.tables_d[,"Promo2SinceWeek"]
Promo2SinceWeek
1: NA
2: NA
3: NA
4: NA
5: NA
---
1017205: 5
1017206: 5
1017207: 5
1017208: 5
1017209: 5
我该怎么做?
我完全不确定下面的代码是否可以回答问题,就像@www在评论中说的那样,它随年份而变化,但是此代码的确获得了第5个月的信息。
技巧是创建一个基准日期,然后使用lubridate::week
函数lubridate::week
。
library(lubridate)
x <- ymd("2018-01-01")
week(x) <- 22
as.integer(format(x, "%m"))
#[1] 5
您可以将此代码用作函数,以将其推广到其他年份。
getMonthFromWeek <- function(Week, Year = 2018){
x <- ymd(paste0(Year, "-01-01"))
week(x) <- Week
as.integer(format(x, "%m"))
}
getMonthFromWeek(22)
#[1] 5
我将使用lubridate库,该库使处理日期更加容易。
library(lubridate)
创建虚拟数据:
Promo2SinceWeek <- c(1, 3, 22, 45, 52)
df <- data.frame(Promo2SinceWeek)
返回月份:
month(lubridate::ymd("2017-01-01") + lubridate::weeks(df$Promo2SinceWeek - 1))
并非lubridate :: ymd(“ 2017-01-01”)指定要查看的年份的第一周,在这种情况下为2017。如果您的数据来自多年,我建议编写一个会改变的函数此值基于df中的另一列。
我同意@www和@RuiBarradas的观点,即需要Year
才能将Week
转换为月。
我发现base R
函数比lubridate
功能更强大,可以处理星期和星期几中的日期。
我从strptime
格式使用%W
,因为它处理的是UK
格式。 ( Monday
为一周的第一天)。 另外, %U
可以用于US
格式( Sunday
为一周的第一天)。
该方法很简单。 以Year
和Week
为单位查找该年中该周的第一天。 一旦找到日期,就可以轻松找到月份。
#Data
merged.tables_d <- data.frame(sl = 1:6,
Promo2SinceWeek = c(4, 14, 22, 24, 30, 35))
# Add another column as month
merged.tables_d$month = as.character(as.Date(
paste(1,merged.tables_d$Promo2SinceWeek,"2018",sep = "/"),"%u/%W/%Y"),
"%m")
merged.tables_d
# sl Promo2SinceWeek month
#1 1 4 01
#2 2 14 04
#3 3 22 05
#4 4 24 06
#5 5 30 07
#6 6 35 08
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.