R语言 将润滑剂功能更改为在周一而非周日开始

np8igboo  于 2022-12-24  发布在  其他
关注(0)|答案(3)|浏览(111)
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是采取的第一天,一周是星期天,而我需要它是星期一-有人有办法绕过这一点?

axkjgtzd

axkjgtzd1#

您可以在base中创建自己的函数来完成此操作。例如,

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"
vuv7lop3

vuv7lop32#

稍微晚了一点,但只是说现在lubridate中有一个选项,默认为星期日,但可以设置为其他值。

# set Monday to be the start of the week globally
options("lubridate.week.start" = 1)

# use lubridate functions
wday(...)
u5i3ibmn

u5i3ibmn3#

正如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

相关问题