首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找最近的周一的数据

查找最近的周一的数据
EN

Stack Overflow用户
提问于 2015-09-24 14:05:33
回答 5查看 1.5K关注 0票数 2

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

代码语言:javascript
复制
df$dates

我需要添加一个“一周开始”的列,即

代码语言:javascript
复制
df[,'WeekStart']= manipulation

周开始的地方是那个星期的星期一。即:今天是星期四的09/15,将有一个条目为“21-9月”。下星期四,01/10/15,将是“28-9月”。

我看到有一个weekday()函数可以将一天转换为一周一天,但是如何处理这个most recent monday呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-09-24 14:30:25

例句:

代码语言:javascript
复制
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")

并运行为

代码语言:javascript
复制
d <- data.frame(dataes=dates, monday=week.starts)

给出

代码语言:javascript
复制
       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

类似的方法,例如:

代码语言:javascript
复制
# 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
票数 1
EN

Stack Overflow用户

发布于 2015-09-24 14:32:39

带有函数base Rstrftime方法。

代码语言:javascript
复制
df$Week.Start <- dates-abs(1-as.numeric(strftime(df$dates, "%u")))

这可以是一个一行,但我们将创建一些变量,看看发生了什么。日期的%u格式模式将一周中的一天作为一个十进制数返回。我们可以将这个数字转换为numeric,并减去与日期的距离。然后,我们可以从日期列中减去该向量。

代码语言:javascript
复制
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

数据

代码语言:javascript
复制
set.seed(7)
all_dates <- seq(Sys.Date(), Sys.Date()+10000, by="days")
dates <- sample(all_dates, 20)
df <- data.frame(dates)
票数 2
EN

Stack Overflow用户

发布于 2015-09-24 14:27:52

从日期中减去到前一个星期一所需的天数如何?例如,如果数据是

代码语言:javascript
复制
dates <- as.Date(c("2000-07-12", "2005-02-19", "2010-09-01"))
weekdays(dates)
# [1] "Wednesday" "Saturday"  "Wednesday"

然后你可以将它与向量进行比较

代码语言:javascript
复制
wdays <- setNames(0:6, c("Monday", "Tuesday", "Wednesday",
            "Thursday", "Friday", "Saturday", "Sunday"))

并减去每一日期起所需的天数

代码语言:javascript
复制
dates - wdays[weekdays(dates)]
#   Wednesday     Saturday    Wednesday 
#"2000-07-10" "2005-02-14" "2010-08-30" 

将在dates中给出每个日期之前的星期一的日期。测试:

代码语言:javascript
复制
weekdays(dates - wdays[weekdays(dates)])
#Wednesday  Saturday Wednesday 
# "Monday"  "Monday"  "Monday" 

所有的东西也可以用一行写成

代码语言:javascript
复制
dates - match(weekdays(dates), c("Monday", "Tuesday", "Wednesday", 
   "Thursday", "Friday", "Saturday", "Sunday")) + 1
#"2000-07-10" "2005-02-14" "2010-08-30" 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32763491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档