Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 查找数据帧的最近星期一_R_Date - Fatal编程技术网

R 查找数据帧的最近星期一

R 查找数据帧的最近星期一,r,date,R,Date,我有一个dataframe对象,在其中的字段中,我有一个日期: df$dates 我需要添加一个“周开始”列,即 df[,'WeekStart']= manipulation 其中,周开始是该周的星期一的日期。i、 e:今天是2015年9月24日星期四,条目为“9月21日”。下周四,2015年10月1日,将是“9月28日” 我看到有一个weekday()函数可以将一天转换为一周,但是我如何处理最近的周一的?一个简单的base-R方法,如果您的日期在R中正确地编码为date类:为.date(u

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

df$dates
我需要添加一个“周开始”列,即

df[,'WeekStart']= manipulation
其中,周开始是该周的星期一的日期。i、 e:今天是2015年9月24日星期四,条目为“9月21日”。下周四,2015年10月1日,将是“9月28日”


我看到有一个
weekday()
函数可以将一天转换为一周,但是我如何处理最近的
周一的

一个简单的base-R方法,如果您的日期在R中正确地编码为date类:
为.date(unclass(dates)-unclass(dates)%%7-3)
。从1970-01-01开始,你解开它的确有天数。然后在7(一周中的某一天!)从除法中减去余数。然后减去3,因为1970-01-01是星期四——

您还可以按周对数据进行分组,然后创建一列“该周的最短日期”。以下是如何在
数据中执行此操作。表
包:

df=data.table(df)
df[,lastMonday:=min(dates),by=.(week(dates))]
如果日期中没有空格,它应该可以工作。 另外,在某些地方,一周从星期天开始,所以你应该小心。
而且,如果您的日期跨度超过一年,您还需要额外的分组变量,那么从日期中减去到达前一个星期一所需的天数如何?e、 g如果您的数据是

dates <- as.Date(c("2000-07-12", "2005-02-19", "2010-09-01"))
weekdays(dates)
# [1] "Wednesday" "Saturday"  "Wednesday"
将在
日期中给出每个日期之前的星期一的日期。要测试:

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" 
简化:

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")
类似的方法,例如:

# 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
#数据

dA
base R
使用函数
strftime
进近

df$Week.Start <- dates-abs(1-as.numeric(strftime(df$dates, "%u")))
数据

set.seed(7)
all_dates <- seq(Sys.Date(), Sys.Date()+10000, by="days")
dates <- sample(all_dates, 20)
df <- data.frame(dates)
set.seed(7)

所有_日期如果您希望最接近当前日期的任何日期和小时,请使用此功能:

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)
}
“2016-08-22”

查找最后一天(此处为“星期五”)


“2016-08-19”

不幸的是,我的约会跨越了几十年。如果我走这条路,我能很容易地将它重新转换成数据帧格式吗?是否有任何理由转到data.table?谢谢如果日期跨越几十年,那么只需向分组变量中添加一年:
df[,lastMonday:=min(日期),by=(周(日期),年(日期)]
。至于软件包,
dplyr
data.table
是最常用于此类任务的。在base R中也可以使用,但需要大量拆分| sapping和其他类似的东西,这非常不方便。data.table在技术上仍然是data.frame,因此格式将保持不变,谢谢。我希望为了手头的任务,理想情况下坚持基本R。我将尝试看看是否有其他方法来解决此问题,如果没有,我将不得不退一步考虑。不幸的是,这是强制性输出,所以我确实需要提供它。我得到以下错误:as.Date.numeric(sapply)中的Rscript master_func.R错误(newdf$dates,函数(d){:‘origin’必须提供调用:main_loop->as.Date->as.Date.numeric Execution暂停newdf[,‘dates’]看起来像:“2015-10-04”“2015-10-05”“2015-10-06”“2015-10-07”“2015-10-08”“2015-10-09”“2015-10-10”“2015-11”“2015-10-12”请参见上面的编辑。我使用的是
xts
,现在改为使用基本包(添加了
origin
),origin是否会通用,即如果我有1970年之前的数据?它将“在内部,日期对象存储为自1970年1月1日以来的天数,使用负数表示更早的日期。”。
# 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
df$Week.Start <- dates-abs(1-as.numeric(strftime(df$dates, "%u")))
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)
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)
}
> dayhour(0,17)
[1] "Sunday 17"
a[1] <-as.Date("2016-08-20")
a[1] + match("Monday",weekdays(seq(a[1]+1, a[1]+6,"days")))
a[1] + (match("Friday",weekdays(seq(a[1]+1, a[1]+6,"days")))-7)