【问题标题】:Using R to Compare Dates使用 R 比较日期
【发布时间】:2015-07-25 10:55:00
【问题描述】:

我有两个 csv 文件。

一个文件列出了员工离职的时间和原因。

EmployeeID,Department,Separation_Type,Separation_Date,FYFQ    
119549,Sales,Retirement,09/30/2013  
2629053,Sales,Termination,09/30/2013  
120395,Sales,Retirement,11/01/2013  
122450,Sales,Transfer,11/30/2013  
123962,Sales,Transfer,11/30/2013  
1041054,Sales,Resignation,12/01/2013  
990962,Sales,Retirement,12/14/2013  
135396,Sales,Retirement,01/11/2014  

另一个文件是一个查找表,显示每个会计季度的开始和结束日期:

FYFQ,Start,End  
FY2014FQ1,10/1/2013,12/31/2013   
FY2014FQ2,1/1/2014,3/31/2014  
FY2014FQ3,4/1/2014,6/30/2014  
FY2014FQ4,7/1/2014,9/30/2014  
FY2015FQ1,10/1/2014,12/31/2014  
FY2015FQ2,1/1/2015,3/31/2015  

我希望 R 找出 Separation_Date 发生在哪个 FYFQ 中,并将其打印到数据的第四列中。

输入:

Separations.csv:   
>EmployeeID,Department,Separation_Type,Separation_Date,FYFQ       
>990962,Sales,Retirement,12/14/2013  
>135396,Sales,Retirement,01/11/2014         

FiscalQuarterDates.csv:

>FYFQ,Start,End  
>FY2013FQ4,7/1/2013,9/30/2013   
>FY2014FQ1,10/1/2013,12/31/2013  
>FY2014FQ2,1/1/2014,3/31/2014

所需的输出:
输出.csv:

>EmployeeID,Department,Separation_Type,Separation_Date,FYFQ      
>990962,Sales,Retirement,12/14/2013,FY2014FQ1
>135396,Sales,Retirement,01/11/2014,FY2014FQ2     

我假设有一些函数会遍历 FiscalQuarterDates.csv 并评估每个分离日期是否在 FYFQ 中,但我不确定。

您有什么想法可以做到这一点吗?

这行得通。

#read in csv and declare th3 4th column a date
separations <- read.csv(file="Separations_DummyData.csv", head=TRUE,sep=",",colClasses=c(NA,NA,NA,"Date"))


#Use the zoo package (I installed it) to convert separation_date to quarter type and then set the quarter back by 1/4. Then construct the variable with FYyFQq. 
library(zoo)
separations$FYFQ <- format(as.yearqtr(separations$Separation_Date, "%m/%d/%Y") + 1/4, "FY%YFQ%q")

#Write out this to CSV in working directory.
write.csv(separations, file = "sepscomplete.csv", row.names = FALSE)

【问题讨论】:

    标签: r date csv


    【解决方案1】:

    你真的不需要第二个数据框:一个简单的函数就可以解决这个问题:

    yr<-with(firstdf,as.numeric(substr(Seperation_Date,7,10)))
    mth<-with(firstdf,as.numeric(substr(Seperation_Date,1,2)))
    
    
        firstdf$FYFQ<-with(firstdf,
    ifelse(mth<=3,paste0("FY",yr,"FQ2"),
    ifelse(mth>3 & mth<=6,paste0("FY",yr,"FQ3"),
    ifelse(mth>7 & mth<=9,paste0("FY",yr,"FQ4"),
    paste0("FY",yr+1,"FQ1")
    ))))
    

    【讨论】:

      【解决方案2】:

      将每个日期转换为 "yearqtr" 类(来自 zoo 包)并添加 1/4 以将其移至下一个日历季度。然后用write.csv写出来:

      library(zoo)
      DF$FYFQ <- format(as.yearqtr(DF$Separation_Date, "%m/%d/%Y") + 1/4, "FY%YFQ%q")
      

      给予:

      > write.csv(DF, file = stdout(), row.names = FALSE)
      "EmployeeID","Department","Separation_Type","Separation_Date","FYFQ"
      990962,"Sales","Retirement","12/14/2013","FY2014FQ1"
      135396,"Sales","Retirement","01/11/2014","FY2014FQ2"
      

      注意:

      1) 如果FYFQ 不需要完全采用所示格式,则可以将其简化为:

      DF$FYFQ <- as.yearqtr(DF$Separation_Date, "%m/%d/%Y") + 1/4
      

      2)未使用问题中列出的第二个输入文件。

      3) 我们将其用于输入数据:

      Lines <- "EmployeeID,Department,Separation_Type,Separation_Date,FYFQ  
      990962,Sales,Retirement,12/14/2013
      135396,Sales,Retirement,01/11/2014"
      
      DF <- read.csv(text = Lines)
      

      4) 已修复,因此它会产生移动的日历季度。

      【讨论】:

        【解决方案3】:

        此答案的文本只是另一个答案的副本,因此已移至问题中。

        【讨论】:

        • 不需要重复另一个答案。每个人都会知道您检查了哪个答案。如果您想提供更多反馈,请使用 cmets 或更新您的问题。
        • @G.Grothendieck “什么有效”不仅仅是一个答案,所以我发表了评论。
        猜你喜欢
        • 2021-12-13
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        相关资源
        最近更新 更多