查找最近一周的数据帧

时间:2015-09-24 14:05:33

标签: r date

我有一个数据框对象,在其中的字段中,我有一个日期:

df$dates

我需要添加一个“Week Starting'”的列,即

df[,'WeekStart']= manipulation

周开始日是该周的星期一。即:今天是2015年9月24日星期四,将有一个条目为' 21-Sept'。下周四,即2015年10月1日,将是' 28-Sept'。

我发现有一个weekday()函数会将一天转换为一周,但我该如何处理这个most recent monday

6 个答案:

答案 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"