根据其他日期将数字转换为日期

问题描述:

根据其他日期,我需要将数字转换为完整日期。由于我分析的动作是在变量“fechafin”后的一天开始的,我预测一天不是日期,所以我需要将它转换为日期,但是如果我说第7天它必须是:2014-07 -07,如果我说第三,必须在2014-08-03。根据其他日期将数字转换为日期

下面是一个例子:

final_muestra1<-data.frame(prior_day1=c(1:17)) 

fechafin=as.Date('2014-07-06') 

所以我定义一个函数:

add.months= function(date,n) seq(date, by = paste (n, "months"), length = 2)[2] 

和行动的第一天会是:

diapri<-as.numeric(format(fechafin+1, "%d"))  

然后我需要计算我预测的日历日期,所以我用ifelse(因为我有NA我添加另一个ifelse)

final_muestra1$prior_day1_comp<- 
    ifelse(!is.na(final_muestra1$prior_day1), 
      ifelse(final_muestra1$prior_day1>=diapri, 
           fechafin-diapri+final_muestra1$prior_day1, 
            add.months((fechafin-diapri+final_muestra1$prior_day1),1)),NA) 

我收到以下错误:

Error in seq.Date(date, by = paste(n, "months"), length = 2) :
'from' must be of length 1

我需要得到如下表:

prior_day1 prior_day1_comp 
1   1 2014-08-01 
2   2 2014-08-02 
3   3 2014-08-03 
4   4 2014-08-04 
5   5 2014-08-05 
6   6 2014-08-06 
7   7 2014-07-07 
8   8 2014-07-08 
+0

我没有完全理解所期望的行为是什么(?是正确的,2014年7月7日是表中两次),但出现错误,因为'date'输入到'add.months'是从2014-06-30到2014-07-16的日期向量,但必须是单个值,因为它是'seq.Date'的开始。 – thie1e 2014-10-09 18:37:37

+0

@ Khl4v,不,这是一个错误。这个想法非常简单:保持一天,但根据一天更改月份。如果一天比迪普普里还要大,那么保持月份的小一点,然后再增加一个月。谢谢 – GabyLP 2014-10-09 18:40:52

+0

@akrun,嗨。有些月有30天 – GabyLP 2014-10-09 18:53:44

我调试你刚才的代码。做检查,如果这是罚款:

library(chron) 
final_muestra1<-data.frame(prior_day1=c(1:17)) 
fechafin=as.Date('2014-07-06') 
diapri<-as.numeric(format(fechafin, "%d")) 
add.months= function(date) seq(chron(as.numeric(date)), by = "months", length = 2)[2] 

for (i in 1:nrow(final_muestra1)){a[i]<-ifelse(!is.na(final_muestra1$prior_day1[i]),ifelse(final_muestra1$prior_day1[i]>diapri, fechafin-diapri+final_muestra1$prior_day1[i], add.months(fechafin-diapri+final_muestra1$prior_day1[i])),NA)} 

final_muestra1$prior_day1_comp<-a 

final_muestra1 
+0

是的,但我不想使用另一个库 – GabyLP 2014-10-09 19:54:23

我解决这个问题的另一种方式(可怕的): 我创造了另一个日期:

fecha_fin_cart=as.Date('2014-08-06') 

diapri<-as.numeric(format(fechafin+1, "%d"))  



fechafin_pri<-as.Date(format(fechafin, "%Y-%m-01")) 

fecha_fin_cart<-as.Date(format(fecha_fin_cart, "%Y-%m-01")) 

创建另一个函数:

gg<-function(d) { 
    NAs <- is.na(d) 
    august <- (!is.na(d) & d <= diapri) 
    july <- (!is.na(d) & d > diapri) 

    ret <- rep(as.Date("2014-01-01"), length(d)) 
    ret[august] <- (fecha_fin_cart) + (d[august]-1) 
    ret[!august] <-(fechafin_pri) + (d[!august]-1) 
    return(ret) 
} 




final_muestra1$xx<-gg(final_muestra1$prior_day1) 

然后:

final_muestra1 
prior_day1   xx 
1   1 2014-08-01 
2   2 2014-08-02 
3   3 2014-08-03 
4   4 2014-08-04 
5   5 2014-08-05 
6   6 2014-08-06 
7   7 2014-07-07 
8   8 2014-07-08 
9   9 2014-07-09 
10   10 2014-07-10 
11   11 2014-07-11 
12   12 2014-07-12 
13   13 2014-07-13 
14   14 2014-07-14 
15   15 2014-07-15 
16   16 2014-07-16 
17   17 2014-07-17 
18   NA  <NA>