R - 周函数返回意外值

时间:2014-11-25 00:16:25

标签: r calendar week-number lubridate

我希望在一年内找到R中的一周的日期列表。但是,输出相当奇怪。

见下文:

week("2000-01-01")
week("2000-01-06")
week("2000-01-07")
week("2000-01-13")
week("2000-01-14")

返回1,1,2,2,3

但是,如果您查看日历:http://calendars.generalblue.com/content/images/calendars/2000/01-January-2000-Calendar.png

你希望它是1,2,3,3,3。

出于某种原因,这将在周四结束。这不奇怪吗?

有谁知道我应该怎么做才能得到预期的1,2,3,3,3个结果?

1 个答案:

答案 0 :(得分:2)

查看?week

  

周数是已发生的完整七天时段的数量   在日期和1月1日之间加一。 isoweek返回一周   因为它出现在ISO 8601系统中,它使用了重新固化   闰周。

使用isoweek功能可以得到以下结果。

require(lubridate)
dates <- c("2000-01-01","2000-01-06","2000-01-07","2000-01-13","2000-01-14") 
sapply(dates, isoweek) 
2000-01-01 2000-01-06 2000-01-07 2000-01-13 2000-01-14 
        52          1          1          2          2

所以一周一次&#34;开始&#34;为了你?在下面的日期函数中,星期日开始一周

require(lubridate)
my_week <- function(x){
  # fst monday of the same year
  first_sun <- as.POSIXct(paste0(year(x),"-01-Mon"), format = "%Y-%U-%a")
  (yday(x) + (7 - yday(first_sun) + 1)) %/% 7
}

dates <- seq(as.Date("2000-01-01"), as.Date("2000-01-15"), by=1)
a <- sapply(dates, my_week)
names(a) <- dates

> a
2000-01-01 2000-01-02 2000-01-03 2000-01-04 2000-01-05 
         0          1          1          1          1          
2000-01-06 2000-01-07 2000-01-08 2000-01-09 2000-01-10 
         1          1          1          2          2    
2000-01-11 2000-01-12 2000-01-13 2000-01-14 2000-01-15 
         2          2          2          2          2