将字符串转换为日期类,格式为dd / mm / yyyy

时间:2014-06-26 15:22:11

标签: r date

我需要一种方法来比较格式为dd/mm/yyyy格式的日期向量和单个日期,目前这个字符串看起来像yyyymmdd

比较每个向量元素时,我需要R来创建一个变量,如果语句是TRUE则分配100,如果是FALSE则分配200

为了做到这一点,我创建了一个函数

tmp_IDtmp_MD是我的日期向量

tgt_date是我需要比较的单一日期

功能:

select_alive<-function(x){

  tmp_ID <- as.Date(x$Issue.date,sep="","%d/%m/%Y")

  tmp_MD <- as.Date(x$Maturity.date,"%d/%m/%Y")  

  tgt_date <- format.Date(as.Date(target_dates_54,"%Y%m%d","%d-%m-%Y"), "%d/%m/%Y")

  Security.Status <-ifelse((tgt_date < tmp_MD) & (tgt_date >= tmp_ID), 100,200)

  x<-cbind(x,Security.Status)

  return(x)
}

该函数应创建一个标记,如果tgt_date落在tmp_IDtmp_MD之间,则分配100,否则分配200,但标记不能正确分配。

Issue.dateMaturity.date属于数据框,如下所示

Issue.date    Maturity.date
06/11/2003    07/11/2033
01/04/2011    NA
03/02/2011    23/03/2012
02/01/2006    02/01/2011
19/11/2010    25/03/2011

target_dates_54是包含日期

的字符串向量
target_dates_54 <- c("20110131","20110228","20110331","20110430".....)

为简单起见,我们假设它只包含一个字符串"20110430"

因此,在这种情况下,tgt_datetarget_dates_54是相同的。

我需要R来获取此字符串并创建一个变量,该变量将{100}分配给"20110430"介于Issue.dateMaturity.date之间的行 否则应分配200

我发现了两个可能的问题:

  1. ifelse可能无法将单个日期与向量的每个元素进行比较
  2. tgt_date需要转换为日期,格式应为dd / mm / yyyy
  3. 我还没有找到解决其中任何一个问题的方法。任何建议都非常感谢。 谢谢!

2 个答案:

答案 0 :(得分:3)

假设tgt_date是单个值(不是向量),请尝试:

library(lubridate)

x <- transform(x, Issue.date = dmy(Issue.date), Maturity.date = dmy(Maturity.date))
tgt_date <- ymd(tgt_date)

x <- mutate(x, Security.Status = ifelse((tgt_date < Maturity.date) & (tgt_date >= Issue.date), 100, 200))

使用您提供的数据:

> x
  Issue.date Maturity.date Security.Status
1 2003-11-06    2033-11-07             100
2 2011-04-01          <NA>              NA
3 2011-02-03    2012-03-23             100
4 2006-01-02    2011-01-02             200
5 2010-11-19    2011-03-25             200

注意:我正在使用lubridate包来转换日期。

答案 1 :(得分:1)

您的功能需要对单个target_date

进行一些更改
 select_alive<-function(x, target_date){
 tmp_ID <- as.Date(x$Issue.date,sep="","%d/%m/%Y")
 tmp_MD <- as.Date(x$Maturity.date,"%d/%m/%Y")  
 tgt_date <- as.Date(target_date,"%Y%m%d") ######
 Security.Status <-ifelse((tgt_date < tmp_MD) & (tgt_date >= tmp_ID), 100,200)
 x<-cbind(x,Security.Status)
 return(x)
 }

target_date <- "20110430"

 select_alive(x, target_date)
 #Issue.date Maturity.date Security.Status
 #1 06/11/2003    07/11/2033             100
 #2 01/04/2011          <NA>              NA
 #3 03/02/2011    23/03/2012             100
 #4 02/01/2006    02/01/2011             200
 #5 19/11/2010    25/03/2011             200

对于多个日期,我不清楚这种情况。也许,可以使用?cut