Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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,我是R编程的初学者,需要帮助在数据集上执行日期操作(希望有一种方法可以在R中实现) 我已将给定数据集作为“交易”导入 deals <- read.csv("deals_dates.csv") 我想找到每笔交易在给定开始日期/结束日期范围内的每月开始日期和结束日期 (预期产出) 谢谢大家! 我们可以首先将“日期”列转换为Date类,然后使用seq按“月”获取“日期”序列,floor日期,以及unest library(tidyverse) df1 %>% mutate_at(v

我是R编程的初学者,需要帮助在数据集上执行日期操作(希望有一种方法可以在R中实现)

我已将给定数据集作为“交易”导入

deals <- read.csv("deals_dates.csv")
我想找到每笔交易在给定开始日期/结束日期范围内的每月开始日期和结束日期

(预期产出)


谢谢大家!

我们可以首先将“日期”列转换为
Date
类,然后使用
seq
按“月”获取“日期”序列,
floor
日期,以及
unest

library(tidyverse)
df1 %>%
   mutate_at(vars(ends_with("Date")), mdy) %>%
   group_by(Deal_Id, Deal_Name) %>% 
   nest %>% 
   mutate(data = map(data, ~ 
       seq(.x$Start_Date, .x$End_Date, by = "1 month") %>%
       {x1 <- floor_date(., unit = "month")
        x2 <-  (x1[-1]-1)
       tibble(Start_Date = c(.x$Start_Date[1], x1[-1]),
              End_date = c(x2, last(.x$End_Date)))})) %>% 
   unnest
库(tidyverse)
df1%>%
在(变量(以“日期”结尾)、mdy%%>
分组依据(交易Id、交易名称)%>%
嵌套%>%
变异(数据=映射(数据,~
seq(.x$Start\u Date,.x$End\u Date,by=“1个月”)%>%

{x1data.table使用
tidyverse
进行一些准备工作的解决方案。实际的周期图片是由数据完成的。table的速度非常快
foverlaps()
。如果您使用的是大数据集,请尝试此解决方案

library( tidyverse )
library( data.table )

#create df with start and end dates
dt1 <- data.table( start = seq( as.Date("2017-01-01"), 
                               length.out = 24,
                               by = "month") ,
                  end = seq( as.Date("2017-02-01"), 
                               length.out = 24,
                               by = "month" ) - 1,
                  stringsAsFactors = FALSE)

#read data with deals
df2 <- read.table(text=" Deal_Id  Deal_Name       Start_Date   End_Date
1        Samsung_Mobile  3/5/2018     6/23/2018
2        Apple_Watch     12/21/2017   2/9/2018", header = T)

#set the dates as actual dates
dt2 <- df2 %>%
  mutate( start = as.Date( as.character(Start_Date), format = "%m/%d/%Y"),
          end = as.Date( as.character(End_Date), format = "%m/%d/%Y") ) %>%
  select( -Start_Date, -End_Date) %>%
  setDT()

setkey(dt1, start, end)
setkey(dt2, start, end)

#create overlap join
dt3 <- foverlaps( dt1, dt2, type = "any", nomatch = 0L)
#set start 
dt3[start < i.start, start := i.start]
#set end
dt3[end > i.end, end := i.end]

#print results
dt3[, c("i.end", "i.start") := NULL ][]

#    Deal_Id      Deal_Name      start        end
# 1:       2    Apple_Watch 2017-12-21 2017-12-31
# 2:       2    Apple_Watch 2018-01-01 2018-01-31
# 3:       2    Apple_Watch 2018-02-01 2018-02-09
# 4:       1 Samsung_Mobile 2018-03-05 2018-03-31
# 5:       1 Samsung_Mobile 2018-04-01 2018-04-30
# 6:       1 Samsung_Mobile 2018-05-01 2018-05-31
# 7:       1 Samsung_Mobile 2018-06-01 2018-06-23
库(tidyverse)
库(data.table)
#创建带有开始和结束日期的df
dt1%
setDT()
设置键(dt1,开始,结束)
设置键(dt2,开始,结束)
#创建重叠连接
dt3 i.end,end:=i.end]
#打印结果
dt3[,c(“i.end”,“i.start”):=NULL][]
#交易\u Id交易\u名称开始结束
#1:2苹果手表2017-12-21 2017-12-31
#2:2苹果手表2018-01-01 2018-01-31
#3:2苹果手表2018-02-01 2018-02-09
#4:1三星移动2018-03-05 2018-03-31
#5:1三星移动2018-04-01 2018-04-30
#6:1三星移动2018-05-01 2018-05-31
#7:1三星移动2018-06-01 2018-06-23

您也可以只使用
vanillar R
执行某些操作。例如,使用以下功能:

myDateFunction <-function(dealName,stdate,endate){

 firstDay <- cut(as.Date(stdate,format = "%m/%d/%Y"), "month")
 Start <-seq(as.Date(firstDay), as.Date(endate,format = "%m/%d/%Y"), by = "month")
 DealName <- rep(dealName,length(Start))
 plusOne<-seq(as.Date(firstDay), by = "month", length = 2)[2]
 End<-seq(as.Date(plusOne),length=4,by="months")-1

 data <- data.frame(DealName,Start,End)
 data$Start[1] <- as.Date(stdate,format = "%m/%d/%Y")
 data$End[-1][3] <- as.Date(endate,format = "%m/%d/%Y")
 return(data)

}
产生以下输出:

library( tidyverse )
library( data.table )

#create df with start and end dates
dt1 <- data.table( start = seq( as.Date("2017-01-01"), 
                               length.out = 24,
                               by = "month") ,
                  end = seq( as.Date("2017-02-01"), 
                               length.out = 24,
                               by = "month" ) - 1,
                  stringsAsFactors = FALSE)

#read data with deals
df2 <- read.table(text=" Deal_Id  Deal_Name       Start_Date   End_Date
1        Samsung_Mobile  3/5/2018     6/23/2018
2        Apple_Watch     12/21/2017   2/9/2018", header = T)

#set the dates as actual dates
dt2 <- df2 %>%
  mutate( start = as.Date( as.character(Start_Date), format = "%m/%d/%Y"),
          end = as.Date( as.character(End_Date), format = "%m/%d/%Y") ) %>%
  select( -Start_Date, -End_Date) %>%
  setDT()

setkey(dt1, start, end)
setkey(dt2, start, end)

#create overlap join
dt3 <- foverlaps( dt1, dt2, type = "any", nomatch = 0L)
#set start 
dt3[start < i.start, start := i.start]
#set end
dt3[end > i.end, end := i.end]

#print results
dt3[, c("i.end", "i.start") := NULL ][]

#    Deal_Id      Deal_Name      start        end
# 1:       2    Apple_Watch 2017-12-21 2017-12-31
# 2:       2    Apple_Watch 2018-01-01 2018-01-31
# 3:       2    Apple_Watch 2018-02-01 2018-02-09
# 4:       1 Samsung_Mobile 2018-03-05 2018-03-31
# 5:       1 Samsung_Mobile 2018-04-01 2018-04-30
# 6:       1 Samsung_Mobile 2018-05-01 2018-05-31
# 7:       1 Samsung_Mobile 2018-06-01 2018-06-23
myDateFunction <-function(dealName,stdate,endate){

 firstDay <- cut(as.Date(stdate,format = "%m/%d/%Y"), "month")
 Start <-seq(as.Date(firstDay), as.Date(endate,format = "%m/%d/%Y"), by = "month")
 DealName <- rep(dealName,length(Start))
 plusOne<-seq(as.Date(firstDay), by = "month", length = 2)[2]
 End<-seq(as.Date(plusOne),length=4,by="months")-1

 data <- data.frame(DealName,Start,End)
 data$Start[1] <- as.Date(stdate,format = "%m/%d/%Y")
 data$End[-1][3] <- as.Date(endate,format = "%m/%d/%Y")
 return(data)

}
myDateFunction("Samsung Mobile","3/5/2018","6/23/2018")
    DealName      Start        End
1 Samsung Mobile 2018-03-05 2018-03-31
2 Samsung Mobile 2018-04-01 2018-04-30
3 Samsung Mobile 2018-05-01 2018-05-31
4 Samsung Mobile 2018-06-01 2018-06-23