2014-10-02 113 views
5
dates <- NULL 

date <- as.Date("01/01/2014","%d/%m/%Y") 

dates <- data.frame(date=as.Date(character()) 
        ,cal_day_in_year_num = numeric() 
        ,cal_week_id = numeric() 
        ,cal_week_start_date = as.Date(character()) 
        ,cal_week_end_date = as.Date(character()) 
) 

for (i in 1:365) { 

    dates[i,1] <- date + days(i-1) ## date 

    dates[i,2] <- yday(dates[i,1]) ## cal_day_in_year_num 

    dates[i,3] <- paste(year(dates[i,1]),sprintf("%02d",week(dates[i,1])),sep="") ## cal_week_id 

    dates[i,4] <- floor_date(dates[i,1], "week") ## cal_week_start_date 

    dates[i,5] <- ceiling_date(dates[i,1], "week") ## cal_week_end_date 

} 

View(dates) 

对于给定的日期,我试图用lubridate函数计算一周的相应的开始和结束日期更改lubridate功能星期一开始,而不是周日

我遇到的问题是那虹膜是在一周的第一天是星期天,因为我需要它是星期一 - 有没有人有办法绕过这个?

+0

虽然这可能不是官方的方式,但您可以简单地添加+1? – Wave 2014-10-02 11:59:36

+1

不幸的是,我不认为加1到cal_week_start_date将工作,例如周日仍将被归类为错误 – 2014-10-02 12:13:37

回答

9

你可以使你自己的功能,在基地做到这一点。例如,

start.of.week <- function(date) 
    date - (setNames(c(6,0:5),0:6) [strftime(date,'%w')]) 

end.of.week <- function(date) 
    date + (setNames(c(0,6:1),0:6) [strftime(date,'%w')]) 

start.of.week(as.Date(c('2014-01-05','2014-10-02','2014-09-22','2014-09-27'))) 
# "2013-12-30" "2014-09-29" "2014-09-22" "2014-09-22" 
end.of.week(as.Date(c('2014-01-05','2014-10-02','2014-09-22','2014-09-27'))) 
# "2014-01-05" "2014-10-05" "2014-09-28" "2014-09-28" 
+0

请注意,我会使用'strftime(date,'%u%')'来获取星期几的星期几,但Windows版本的'strftime'不支持''%u%''。这也适用于Windows。 – nograpes 2014-10-02 14:27:40

+0

感谢功能很棒+会使用strftime前进 – 2014-10-02 15:03:58

-1

由于Wave评论,您可以使用+1来更改日期。您也可以按照您所做的完成相同的操作,而无需使用慢循环的for循环。

date <- as.Date("01/01/2014","%d/%m/%Y") 

yday(date) <-yday(date) + 0:364 
dates <- data.frame(date = date, 
        cal_day_in_year_num = yday(date), 
        cal_week_id = paste(year(date),sprintf("%02d",week(date)),sep=""), 
        cal_week_start_date = NA, 
        cal_week_end_date = NA 
        ) 

# find the minimum date in the time series 
min_date <- min(dates$date) 
# find the previous Monday of the minimum date 
for(i in 1:7){ 
    if(wday(min_date-i, label=TRUE)=="Mon"){ 
    start_date <- min_date-i 
    } 
} 

# get the number of days between the minimum date and all days 
diff_days <- as.numeric(difftime(dates$date,start_date, units="days")) 
# Remove the excess days from each date 
dates$cal_week_start_date <- dates$date-diff_days%%7 
# Fix up the end of the week based on the start of the week 
dates$cal_week_end_date <- dates$cal_week_start_date+7 
+0

嗨,不幸的是,这不起作用,请检查你的例子1月5日。由于星期天被认为是在一周内开始和结束日期计算得到分裂 – 2014-10-02 12:24:57

+0

你可以用ifelse语句解决周日问题:日期$ cal_week_start_dat = ifelse(日期(日期$ date,标签= T)==“Sun”, floor_date(日期$ date,“week”) - 6,floor_date(日期$ date,“week”)+ 1)。 – Wave 2014-10-02 12:56:32

相关问题