如何将数据框中的工作日转换为对应周的周六
解决方法:给工作日添加对应周的周六列
我来帮你搞定这个需求!既然你已经把日期转成了Date格式,而且所有日期都是工作日,那我们可以直接通过计算得到对应周的周六,不用额外判断工作日啦。
方法一:用lubridate包(和你现有代码兼容)
你已经在使用lubridate的week()和ymd()函数,那继续用这个包的工具会很顺手:
library(lubridate) # 你的原始代码 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)) # 新增EOW列:计算对应周的周六 df$EOW = df$date + days(7 - wday(df$date))
原理说明:
wday(df$date)会返回日期对应的星期几(默认周日=1,周一=2,…,周六=7)- 因为所有日期都是工作日(周一到周五,对应wday=2到6),
7 - wday(df$date)就是从当前日期到本周六的天数差,加上这个天数就能得到周六的日期
运行后你会得到预期的结果:
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
方法二:基础R实现(不用额外包)
如果你不想依赖lubridate,用基础R的as.POSIXlt()也能实现:
# 你的原始代码 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=format(df$date, "%V") # 基础R提取周数,和lubridate的week()结果一致 # 新增EOW列 df$EOW = df$date + (6 - as.POSIXlt(df$date)$wday)
原理说明:
as.POSIXlt(df$date)$wday返回的星期几是周日=0,周一=1,…,周六=66 - as.POSIXlt(df$date)$wday就是当前工作日到本周六的天数差,加上后得到目标日期
两种方法都能完美得到你想要的结果,选你习惯的方式就行~
内容的提问来源于stack exchange,提问作者Ami
相关产品推荐
相关产品推荐

