[英]R - Date format conversion using string methods
我目前有一个包含15个变量和大约300万行的数据框。
其中一列的是一个日期栏,格式化为yyyymmdd
和我的目标是重新格式化的字符串作为yyyymm01
如果dd
是>=1
和<=14
和yyyymm02
否则。
当我运行代码时,我得到
Error in 1:end : NA/NaN argument
我不太清楚为什么。 我的代码如下。
for(i in 1:end)
{
technical.montday[i] = substr(toString(technical$datadate[i]), start = 1, stop = 6)
technical$datadate[i] = ifelse((as.integer(substr(toString(technical$datadate[i]),start = 7, stop = 8)) >= 1) && (as.integer(substr(toString(technical$datadate[i]),start = 7, stop = 8))<=14),paste(technical.montday,"01", sep=""), paste(technical.montday,"15", sep="") )
}
其中一列是日期列,其格式为yyyymmdd,我的目标是如果dd> = 1且<= 14则将该字符串重新格式化为yyyymm01,否则将其格式化为yyyymm02。
我不理解您的代码,但是您可以说以下内容:
# suppose DATE is the date column
dd <- as.integer(substr(DATE, 7,8))
DATE <- paste0(substr(DATE, 1, 6), ifelse(dd<=14 & dd>=1, "01", "02")
ifelse
部分可能会缩短为ifelse(dd<=14, "01", "02")
。 如果您需要DATE为数字,请添加as.numeric
或as.integer
。
使用子字符串替换可能更有效:
DATE <- as.character(DATE)
substr(DATE, 7,8) <- ifelse(substr(DATE, 7,8) > 14, "02", "01")
(请注意,substr(DATE,7,8)被隐式转换为数字。)它的工作原理是:
> DATE <- as.character(20140401:20140430)
> substr(DATE, 7,8) <- ifelse(substr(DATE, 7,8) > 14, "02", "01")
> DATE
[1] "20140401" "20140401" "20140401" "20140401" "20140401" "20140401"
[7] "20140401" "20140401" "20140401" "20140401" "20140401" "20140401"
[13] "20140401" "20140401" "20140402" "20140402" "20140402" "20140402"
[19] "20140402" "20140402" "20140402" "20140402" "20140402" "20140402"
[25] "20140402" "20140402" "20140402" "20140402" "20140402" "20140402"
也许采取不同的方法:
technical <- data.frame(datadate = c("20140101", "20140203", "20131216", "20131130"),
stringsAsFactors = FALSE)
print(technical$datadate)
## [1] "20140101" "20140203" "20131216" "20131130"
technical$datadate <- sapply(technical$datadate, function(x) {
year.mon <- substr(x, 1, 6)
dd <- as.numeric(substr(x, 7, 8))
return(paste(year.mon, ifelse((dd > 14), "02", "01"), sep = "", collapse = ""))
})
print(technical$datadate)
## [1] "20140101" "20140201" "20131202" "20131102"
注意: paste0
可能更快,这对您的情况可能很重要。 出于这样的原因,我也很sapply
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.