R: How to get the Week number of the month

前端 未结 9 826
孤街浪徒
孤街浪徒 2020-11-30 04:05

I am new in R.
I want the week number of the month, which the date belongs to.

By using the following code:

>CurrentDate<-Sys.Date()
>We         


        
相关标签:
9条回答
  • 2020-11-30 04:59

    By analogy of the weekdays function:

    monthweeks <- function(x) {
        UseMethod("monthweeks")
    }
    monthweeks.Date <- function(x) {
        ceiling(as.numeric(format(x, "%d")) / 7)
    }
    monthweeks.POSIXlt <- function(x) {
        ceiling(as.numeric(format(x, "%d")) / 7)
    }
    monthweeks.character <- function(x) {
        ceiling(as.numeric(format(as.Date(x), "%d")) / 7)
    }
    dates <- sample(seq(as.Date("2000-01-01"), as.Date("2015-01-01"), "days"), 7)
    dates
    #> [1] "2004-09-24" "2002-11-21" "2011-08-13" "2008-09-23" "2000-08-10" "2007-09-10" "2013-04-16"
    monthweeks(dates)
    #> [1] 4 3 2 4 2 2 3
    

    Another solution to use stri_datetime_fields() from the stringi package:

    stringi::stri_datetime_fields(dates)$WeekOfMonth
    #> [1] 4 4 2 4 2 3 3
    
    0 讨论(0)
  • 2020-11-30 04:59

    I came across the same issue and I solved it with mday from data.table package. Also, I realized that when using the ceiling() function, one also needs to account for the '5th week' situation. For example ceiling of the 30th day of a month ceiling(30/7) will give 5 ! Therefore, the ifelse statement below.

    # Create a sample data table with days from year 0 until present
    DT <- data.table(days = seq(as.Date("0-01-01"), Sys.Date(), "days"))
    # compute the week of the month and account for the '5th week' case
    DT[, week := ifelse( ceiling(mday(days)/7)==5, 4, ceiling(mday(days)/7) )]
    
    > DT
                  days week
         1: 0000-01-01    1
         2: 0000-01-02    1
         3: 0000-01-03    1
         4: 0000-01-04    1
         5: 0000-01-05    1
        ---                
    736617: 2016-10-14    2
    736618: 2016-10-15    3
    736619: 2016-10-16    3
    736620: 2016-10-17    3
    736621: 2016-10-18    3
    

    To have an idea about the speed, then run:

    system.time( DT[, week := ifelse( ceiling(mday(days)/7)==5, 4, ceiling(mday(days)/7) )] )
       # user  system elapsed 
       # 3.23    0.05    3.27
    

    It took approx. 3 seconds to compute the weeks for more than 700 000 days.

    However, the ceiling way above will always create the last week longer than all the other weeks (the four weeks have 7,7,7, and 9 or 10 days). Another way would be to use something like

    ceiling(1:31/31*4)
     [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4
    

    where you get 7, 8 , 8 and 8 days per respective week in a 31 days month.

    DT[, week2 := ceiling(mday(days)/31*4)]
    
    0 讨论(0)
  • 2020-11-30 05:00

    I don't know R but if you take the week of the first day in the month you could use it to get the week in the month

    2014-09-18
    First day of month = 2014-09-01
    Week of first day on month = 36
    Week of 2014-09-18 = 38
    Week in the month = 1 + (38 - 36) = 3
    
    0 讨论(0)
提交回复
热议问题