[英]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.