按周数获取一年中的月份数

时间:2018-02-17 12:35:04

标签: r

我的专栏中有一周的数字:

> 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 个月。 所以结果应该是这样的:

public class RedirectUnauthorizedRoles : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (this.AuthorizeCore(filterContext.HttpContext))
        {
            base.OnAuthorization(filterContext);
        }
        else
        {

           //Example if User is Valid then i will return 1 else it will return 0
            var value = true ? "1" : "0";

            filterContext.Result = new JsonResult()
            {
                Data = value
            };
        }
    }
}

我该怎么办呢?

3 个答案:

答案 0 :(得分:2)

我完全不确定下面的代码是否回答了这个问题,就像@www在评论中说的那样,这与年份有所不同,但这段代码确实得到了第5个月。
诀窍是创建一个基准日期,然后使用函数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

答案 1 :(得分:2)

我会使用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(&#34; 2017-01-01&#34;)指定您正在查看的一年中的第一周,在本例中为2017年。如果您的数据来自多年我建议编写一个函数,根据你的df中的另一列改变这个值。

答案 2 :(得分:1)

我同意@www和@RuiBarradas将Year转换为月份需要Week

我发现base R功能比lubridate更强大,可以处理星期和星期的日期。

我使用%W格式的strptime处理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