如何将日期转换为最近的周末(星期六)
How to convert date to the closest weekend (Saturday)
我有一个日期格式为“%d-%m-%Y”的数据框,并且有周数。日期是工作日,我想在另一列中显示该周的星期六。
我最初使用 Chron 包中的函数检查日期是工作日还是周末,但那是布尔验证。我已将日期变量格式化为日期格式并提取每个日期的周数。
df = data.frame(date=c("2014-08-20", "2014-08-25", "2014-10-08"))
df$date=as.Date(df$date,format="%Y-%m-%d")
df$week=week(ymd(df$date))
预期结果应该是:
date week EOW
2014-08-20 34 2014-08-23
2014-08-25 34 2014-08-30
2014-10-08 41 2014-10-11
基础 R 选项。首先创建一个所有天的列表,然后 match
它与 weekdays
并从 6 中减去它(因为我们想要星期六)以获得我们需要在原始 date
列中添加的天数.
all_days <- c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")
#As @nicola mentioned this is locale dependent
#If your locale is not English you need weekdays in your current locale
#which you can manually write as shown above or do any one of the following
#all_days <- weekdays(seq(as.Date("2019-01-14"),by="day",length.out=7))
#OR
#all_days <- format(seq(as.Date("2019-01-14"),by="day",length.out=7), "%A")
df$EOW <- df$date + 6 - match(weekdays(df$date), all_days)
df
# date week EOW
#1 2014-08-20 34 2014-08-23
#2 2014-08-25 34 2014-08-30
#3 2014-10-08 41 2014-10-11
或者 lubridate
有一个函数 ceiling_date
,当与 unit = "week"
一起使用时,它将 return 成为下一个 "Sunday",所以我们从中减去 1 天取而代之的是 "Saturday"。
library(lubridate)
df$EOW <- ceiling_date(df$date, unit = "week") - 1
另一种使用方式
library(data.table)
df <- data.table(date=c("2014-08-20", "2014-08-25", "2014-10-08"))
df$date=as.Date(df$date,format="%Y-%m-%d")
df$week=week(ymd(df$date))
## if the locale is not English, please use the local values for days
days <- data.frame(DOW = c("Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday", "Sunday"))
days$day <- seq(1,7,1)
df <- df[,DOW:= weekdays(date)]
df <- merge(df, days, all.x = T, by = "DOW")
df <- df[, EOW := date + (6 - day)]
df
DOW date week day EOW
1: Monday 2014-08-25 34 1 2014-08-30
2: Wednesday 2014-08-20 34 3 2014-08-23
3: Wednesday 2014-10-08 41 3 2014-10-11
尝试使用 data.table
连接语法:
library(data.table)
# Create a saturdays dataset
saturdays2014 <- data.table(date = seq(as.Date("2014-01-01"), as.Date("2014-12-31"), by = 1))
Sys.setlocale("LC_ALL","English")
saturdays2014 <- saturdays2014[weekdays(date) == "Saturday"]
# convert df to data.table and date to a Date variable
setDT(df)[, date := as.Date(date)]
# Join
df[saturdays2014, on = "date", roll = 6, EOW := i.date]
df
# date EOW
# 1: 2014-08-20 2014-08-23
# 2: 2014-08-25 2014-08-30
# 3: 2014-10-08 2014-10-11
我有一个日期格式为“%d-%m-%Y”的数据框,并且有周数。日期是工作日,我想在另一列中显示该周的星期六。
我最初使用 Chron 包中的函数检查日期是工作日还是周末,但那是布尔验证。我已将日期变量格式化为日期格式并提取每个日期的周数。
df = data.frame(date=c("2014-08-20", "2014-08-25", "2014-10-08"))
df$date=as.Date(df$date,format="%Y-%m-%d")
df$week=week(ymd(df$date))
预期结果应该是:
date week EOW
2014-08-20 34 2014-08-23
2014-08-25 34 2014-08-30
2014-10-08 41 2014-10-11
基础 R 选项。首先创建一个所有天的列表,然后 match
它与 weekdays
并从 6 中减去它(因为我们想要星期六)以获得我们需要在原始 date
列中添加的天数.
all_days <- c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")
#As @nicola mentioned this is locale dependent
#If your locale is not English you need weekdays in your current locale
#which you can manually write as shown above or do any one of the following
#all_days <- weekdays(seq(as.Date("2019-01-14"),by="day",length.out=7))
#OR
#all_days <- format(seq(as.Date("2019-01-14"),by="day",length.out=7), "%A")
df$EOW <- df$date + 6 - match(weekdays(df$date), all_days)
df
# date week EOW
#1 2014-08-20 34 2014-08-23
#2 2014-08-25 34 2014-08-30
#3 2014-10-08 41 2014-10-11
或者 lubridate
有一个函数 ceiling_date
,当与 unit = "week"
一起使用时,它将 return 成为下一个 "Sunday",所以我们从中减去 1 天取而代之的是 "Saturday"。
library(lubridate)
df$EOW <- ceiling_date(df$date, unit = "week") - 1
另一种使用方式
library(data.table)
df <- data.table(date=c("2014-08-20", "2014-08-25", "2014-10-08"))
df$date=as.Date(df$date,format="%Y-%m-%d")
df$week=week(ymd(df$date))
## if the locale is not English, please use the local values for days
days <- data.frame(DOW = c("Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday", "Sunday"))
days$day <- seq(1,7,1)
df <- df[,DOW:= weekdays(date)]
df <- merge(df, days, all.x = T, by = "DOW")
df <- df[, EOW := date + (6 - day)]
df
DOW date week day EOW
1: Monday 2014-08-25 34 1 2014-08-30
2: Wednesday 2014-08-20 34 3 2014-08-23
3: Wednesday 2014-10-08 41 3 2014-10-11
尝试使用 data.table
连接语法:
library(data.table)
# Create a saturdays dataset
saturdays2014 <- data.table(date = seq(as.Date("2014-01-01"), as.Date("2014-12-31"), by = 1))
Sys.setlocale("LC_ALL","English")
saturdays2014 <- saturdays2014[weekdays(date) == "Saturday"]
# convert df to data.table and date to a Date variable
setDT(df)[, date := as.Date(date)]
# Join
df[saturdays2014, on = "date", roll = 6, EOW := i.date]
df
# date EOW
# 1: 2014-08-20 2014-08-23
# 2: 2014-08-25 2014-08-30
# 3: 2014-10-08 2014-10-11