2014-10-02 17 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) 

Dla podanych terminach Próbuję użyć funkcji lubridate obliczyć początkowe i końcowe odpowiednie termin tygodniaZmiana funkcji lubridate zacząć w poniedziałek zamiast niedzieli

Problem mam jest, to, że lubridate przyjmuje pierwszy dzień tygodnia na niedzielę, gdzie tak jak ja potrzebuję na poniedziałek - czy ktoś ma do tego rację?

+0

Chociaż może to nie być oficjalna metoda, możesz po prostu dodać +1? – Wave

+1

Niestety nie sądzę, że dodanie 1 do cal_week_start_date zadziała jak na przykład niedziela będzie nadal klasyfikowana błędnie –

Odpowiedz

9

Możesz wykonać własne funkcje, aby zrobić to w bazie. Na przykład:

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

Zauważ, że użyłbym 'strftime (date, '% u%')', aby uzyskać liczbę całkowitą z dnia tygodnia, która używa poniedziałku, ale wersja 'strftime' dla systemu Windows nie obsługuje' '% u%'. Działa to również w systemie Windows. – nograpes

+0

Funkcja dziękuję jest świetna + użyje strftime idąc do przodu –

-1

Jak skomentował Wave, możesz użyć +1, aby zmienić datę. Możesz także zrobić to samo, co zrobiłeś bez potrzeby powolnej pętli 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

cześć, niestety to nie działa, sprawdź 5 stycznia w twoim przykładzie. Ponieważ niedziela jest uważana za datę rozpoczęcia i zakończenia obliczeń w ciągu tygodnia, podziel się –

+0

Możesz obejść problem niedzieli z instrukcją ifelse: date $ cal_week_start_dat = ifelse (wday (date $ date, label = T) == "Sun", floor_date (date $ date, "week") - 6, floor_date (date $ date, "week") + 1). – Wave

Powiązane problemy