2014-10-02 59 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

相關問題