根据其他日期将数字转换为日期
问题描述:
根据其他日期,我需要将数字转换为完整日期。由于我分析的动作是在变量“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
答
我调试你刚才的代码。做检查,如果这是罚款:
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>
我没有完全理解所期望的行为是什么(?是正确的,2014年7月7日是表中两次),但出现错误,因为'date'输入到'add.months'是从2014-06-30到2014-07-16的日期向量,但必须是单个值,因为它是'seq.Date'的开始。 – thie1e 2014-10-09 18:37:37
@ Khl4v,不,这是一个错误。这个想法非常简单:保持一天,但根据一天更改月份。如果一天比迪普普里还要大,那么保持月份的小一点,然后再增加一个月。谢谢 – GabyLP 2014-10-09 18:40:52
@akrun,嗨。有些月有30天 – GabyLP 2014-10-09 18:53:44