/ / Alterar a função do lubridato para começar na segunda-feira em vez de no domingo - r, lubridate

Alterar a função do lubridato para começar na segunda-feira em vez de no domingo - r, lubridate

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)

Para determinadas datas, estou tentando usar a função lubricidate para calcular as datas de início e término correspondentes da semana

A questão que eu estou tendo é que o lubridato está tomando o primeiro dia da semana para ser domingo, onde eu preciso que seja segunda-feira - alguém tem um jeito nisso?

Respostas:

9 para resposta № 1

Você pode fazer suas próprias funções para fazer isso na base. Por exemplo,

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"

-1 para resposta № 2

Como o Wave comentou, você pode usar apenas +1 para alterar a data. Você também pode fazer o mesmo que você fez sem a necessidade do lento for loop.

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