簡體   English   中英

R-使用字符串方法轉換日期格式

[英]R - Date format conversion using string methods

我目前有一個包含15個變量和大約300萬行的數據框。

其中一列的是一個日期欄,格式化為yyyymmdd和我的目標是重新格式化的字符串作為yyyymm01如果dd>=1<=14yyyymm02否則。

當我運行代碼時,我得到

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.numericas.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM