我有一个数据框对象,在其中的字段中,我有一个日期:
df$dates
我需要添加一个“Week Starting'”的列,即
df[,'WeekStart']= manipulation
周开始日是该周的星期一。即:今天是2015年9月24日星期四,将有一个条目为' 21-Sept'。下周四,即2015年10月1日,将是' 28-Sept'。
我发现有一个weekday()
函数会将一天转换为一周,但我该如何处理这个most recent monday
?
答案 0 :(得分:2)
使用base R
函数的strftime
方法。
df$Week.Start <- dates-abs(1-as.numeric(strftime(df$dates, "%u")))
这可以是一个单行,但我们会创建一些变量来查看发生了什么。日期的%u
格式模式将星期几作为单个十进制数返回。我们可以将该数字转换为numeric
并减去与日期的距离。然后我们可以从日期列中减去该向量。
day_of_week <- as.numeric(strftime(df$dates, "%u"))
day_diff <- abs(1-day_of_week)
df$Week.Start <- dates-day_diff
# dates Week.Start
# 1 2042-10-22 2042-10-20
# 2 2026-08-14 2026-08-10
# 3 2018-11-23 2018-11-19
# 4 2017-08-21 2017-08-21
# 5 2022-05-26 2022-05-23
# 6 2037-05-27 2037-05-25
数据强>
set.seed(7)
all_dates <- seq(Sys.Date(), Sys.Date()+10000, by="days")
dates <- sample(all_dates, 20)
df <- data.frame(dates)
答案 1 :(得分:1)
如何从日期中减去前一个星期一所需的天数?例如,如果您的数据是
dates <- as.Date(c("2000-07-12", "2005-02-19", "2010-09-01"))
weekdays(dates)
# [1] "Wednesday" "Saturday" "Wednesday"
然后你可以将它与矢量
进行比较wdays <- setNames(0:6, c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"))
并从每个日期减去所需的天数,即
dates - wdays[weekdays(dates)]
# Wednesday Saturday Wednesday
#"2000-07-10" "2005-02-14" "2010-08-30"
将在dates
中给出每个日期之前的星期一的日期。测试:
weekdays(dates - wdays[weekdays(dates)])
#Wednesday Saturday Wednesday
# "Monday" "Monday" "Monday"
一切都可以写成一行
dates - match(weekdays(dates), c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday")) + 1
#"2000-07-10" "2005-02-14" "2010-08-30"
答案 2 :(得分:1)
Simples:
dates <-(Sys.Date()+1:30)
week.starts <- as.Date(sapply (dates, function(d) { return (d + (-6 - as.POSIXlt(d)$wday %% -7 ))}), origin = "1970-01-01")
并以
运行d <- data.frame(dataes=dates, monday=week.starts)
给出
dataes monday
1 2015-09-25 2015-09-21
2 2015-09-26 2015-09-21
3 2015-09-27 2015-09-21
4 2015-09-28 2015-09-28
5 2015-09-29 2015-09-28
6 2015-09-30 2015-09-28
7 2015-10-01 2015-09-28
8 2015-10-02 2015-09-28
9 2015-10-03 2015-09-28
10 2015-10-04 2015-09-28
11 2015-10-05 2015-10-05
12 2015-10-06 2015-10-05
13 2015-10-07 2015-10-05
14 2015-10-08 2015-10-05
15 2015-10-09 2015-10-05
16 2015-10-10 2015-10-05
17 2015-10-11 2015-10-05
18 2015-10-12 2015-10-12
19 2015-10-13 2015-10-12
20 2015-10-14 2015-10-12
21 2015-10-15 2015-10-12
22 2015-10-16 2015-10-12
23 2015-10-17 2015-10-12
24 2015-10-18 2015-10-12
25 2015-10-19 2015-10-19
26 2015-10-20 2015-10-19
27 2015-10-21 2015-10-19
28 2015-10-22 2015-10-19
29 2015-10-23 2015-10-19
30 2015-10-24 2015-10-19
类似的方法,例如:
# data
d <- data.frame(date = as.Date( c("20/09/2015","24/09/2015","28/09/2015","01/10/2015"), "%d/%m/%Y"))
# get monday
d$WeekStart <- d$date - 6 - (as.POSIXlt(d$date)$wday %% -7)
d
# result
# date WeekStart
# 1 2015-09-20 2015-09-14
# 2 2015-09-24 2015-09-21
# 3 2015-09-28 2015-09-28
# 4 2015-10-01 2015-09-28
答案 3 :(得分:1)
a[1] <-as.Date("2016-08-20")
查找第二天(此处&#34;星期一和#34;)
a[1] + match("Monday",weekdays(seq(a[1]+1, a[1]+6,"days")))
&#34; 2016年8月22日&#34;
查找最后一天(此处&#34;星期五和#34;)
a[1] + (match("Friday",weekdays(seq(a[1]+1, a[1]+6,"days")))-7)
&#34; 2016年8月19日&#34;
答案 4 :(得分:0)
如果您的日期在R:as.Date(unclass(dates)-unclass(dates)%%7-3)
中正确编码为日期类,则使用简单的base-R方式。你取消分类它确实得到自1970-01-01以来的天数。然后在7(星期几!)中从除法中减去余数。然后减去3,因为1970-01-01是星期四 -
此外,您可以按周对数据进行分组,然后创建一个&#34;该周最小日期&#34;的列。以下是data.table
包中的方法:
df=data.table(df)
df[,lastMonday:=min(dates),by=.(week(dates))]
如果日期中没有空格,它应该可以工作。 此外,在某些地区,周从星期日开始,所以你应该小心。 如果您的日期超过一年,您将需要额外的分组变量
答案 5 :(得分:0)
如果您想要在当前日期的任何一天和每小时最近,请使用此功能:
dayhour <- function(day,hour){
k <- as.Date(Sys.time())+day-as.numeric(format(strptime(Sys.time(),format="%Y-%m-%d %H:%M:%S"), format ='%u'))
dh <- format(strptime(paste(k,hour), format="%Y-%m-%d %H"), format="%A %H")
return(dh)
}
对于工作日,分别使用0到6作为周日至星期六的日期参数:
> dayhour(0,17)
[1] "Sunday 17"