簡體   English   中英

通過星期數獲取一年中的月份數

[英]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為一周的第一天)。

該方法很簡單。 YearWeek為單位查找該年中該周的第一天。 一旦找到日期,就可以輕松找到月份。

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM