簡體   English   中英

處理包含兩位和四位數年份的日期

[英]Handling dates with mix of two and four digit years

我有一個包含許多文件的文件夾(可通過list.fileslapply讀取),這些文件混合使用兩位數和四位數的年份。 80年代和90年代的日期是兩位數字,而2000年代的日期是4位數字(但是在每個文件中它們混合在一起,所以我不能對文件名進行正則表達式)。

有沒有一種首選的方式來解決這個問題? 我有以下臨時解決方案。

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? 恐怕由於leap年等原因,此操作將自動失敗。 謝謝!

如果您只需要在只有兩位數年份的日期之前添加“ 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

我們可以修改對上一個問題的答案,以適應這種“模棱兩可”的情況:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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