处理两位和四位数年份的日期

时间:2013-02-15 11:07:47

标签: r date

我有一个包含许多文件的文件夹(通过list.fileslapply阅读),使用两位和四位数的混合。 80年代和90年代的日期是两位数,2000年代的日期是四位数(但这些数字在每个文件中都是混合的,所以我不能正则表达文件名)。

有没有一种首选的方法来处理这个问题?我有以下临时解决方案。

vec1 <- c("06/30/97", "12/31/99", "01/01/2000", "05/25/2001")
vec2 <- as.POSIXlt(as.Date(vec1, "%m/%d/%Y"))
vec3 <- vec2
vec3$year <- ifelse(vec3$year < 100, vec3$year + 1900, vec3$year)

这似乎特别笨拙。这些案例有效,但是这必然会做出正确的%y到%Y调整吗?我担心由于闰年等原因,这种情况会无声无息。谢谢!

2 个答案:

答案 0 :(得分:3)

如果您知道只需在年份只有2位数的日期之前添加“19”,您也可以使用gsub

vec1 <- c("06/30/97", "12/31/99", "01/01/2000", "05/25/2001")
gsub("(.*)/(..)$", "\\1/19\\2", vec1)
# [1] "06/30/1997" "12/31/1999" "01/01/2000" "05/25/2001

答案 1 :(得分:2)

我们可以修改我的answer to a previous question以适应这种更“模棱两可”的案例:

multidate <- function(data, formats){
    a<-list()
    for(i in 1:length(formats)){
        a[[i]]<- as.Date(data,format=formats[i])
        a[[i]][a[[i]]>Sys.Date() | a[[i]]<as.Date("1000-01-01")]<-NA
        a[[1]][!is.na(a[[i]])]<-a[[i]][!is.na(a[[i]])]
        }
    a[[1]]
    }

multidate(vec1, c("%m/%d/%Y","%m/%d/%y"))
[1] "1997-06-30" "1999-12-31" "2000-01-01" "2001-05-25"
#or
multidate(vec1, c("%m/%d/%y","%m/%d/%Y"))
[1] "1997-06-30" "1999-12-31" "2000-01-01" "2001-05-25"

只要你将来没有约会就行了。如果您这样做,请在以后的任何其他日期更改Sys.Date()