【问题标题】:Handling dates with mix of two and four digit years处理包含两位数和四位数字年份的日期
【发布时间】:2013-01-31 08:22:44
【问题描述】:

我有一个包含许多文件的文件夹(通过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 吗?恐怕这会因为闰年之类的而悄然失败。谢谢!

【问题讨论】:

    标签: r date


    【解决方案1】:

    我们可以修改我的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() 更改为任何其他未来日期。

    【讨论】:

    • 感谢您的课程。在这种情况下,我认为gsub() 解决方案对我来说更好一些。
    【解决方案2】:

    如果您知道只需在只有 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
    

    【讨论】:

    • 谢谢,朱巴。事后看来总是很明显。 :) (而且我可以轻松找到违规行为...所有数据都在 80 年代、90 年代和 2000 年代。)
    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多