【问题标题】:Extracting year from unformatted date character vector从未格式化的日期字符向量中提取年份
【发布时间】:2018-04-10 14:41:31
【问题描述】:

我有一个字符向量,它以未格式化的日期表示覆盖年份,如下所示:

     Period of coverage
1    1/1/2011 to 31/12/2011
2    1/1/2010 to 31/12/2010
3    1/1/2012 to 31/12/2012
4    1/1/2010 to 31/12/2010
5    1/1/2011 to 31/12/2011
6    1/1/2012 to 31/12/2012
7    1/1/2010 to 31/12/2010
8    1/1/2010 to 31/12/2010
9    1/1/2009 to 31/12/2009

我想知道如何才能将列转换为每个观察代表的年份。每行都有相同的开始日期和结束日期(1/1 和 31/12)。

【问题讨论】:

    标签: r date dplyr data-munging


    【解决方案1】:

    假设您的数据存储在变量period 中,并且您所有日期的格式都如您所述保持不变,

    yr = substr(period, 19, 22)
    

    【讨论】:

      【解决方案2】:

      如果您的字符串始终具有相同的格式,您可以简单地使用子字符串并将其转换为日期:

          as.Date(substr("1/1/2011 to 31/12/2011",5,8), format="%Y") 
      as.Date(substr("1/1/2011 to 31/12/2011",19,23), format="%Y")
      

      如果字符串比较多变,但总是被“to”分割,你可以用 stringsplit 取消列出字符串,然后将其格式化为年份:

      a <- "1/1/2011 to 31/12/2011"
      a2 <- strsplit(a, "to") ;
      a3 <- unlist(a2) ;
      a4 <- as.Date(a3, format="%d/%m/%Y")
      year = format(a4, format="%Y")
      

      【讨论】:

        【解决方案3】:

        假设DF 在最后的注释中重复显示,删除最后一个斜线之前的所有内容并转换为数字:

        transform(DF, year = as.numeric(sub(".*/", "", `Period of coverage`)), check.names = FALSE)
        

        给予:

              Period of coverage year
        1 1/1/2011 to 31/12/2011 2011
        2 1/1/2010 to 31/12/2010 2010
        3 1/1/2012 to 31/12/2012 2012
        4 1/1/2010 to 31/12/2010 2010
        5 1/1/2011 to 31/12/2011 2011
        6 1/1/2012 to 31/12/2012 2012
        7 1/1/2010 to 31/12/2010 2010
        8 1/1/2010 to 31/12/2010 2010
        9 1/1/2009 to 31/12/2009 2009
        

        另一种可能性是首先将其转换为 Date 类,注意 as.Date 在末尾忽略垃圾:

        to_year <- function(x, fmt) as.numeric(format(as.Date(x, fmt), "%Y"))
        transform(DF, year = to_year(`Period of coverage`, "%d/%m/%Y"), check.names = FALSE)
        

        注意

        Lines <- "     Period of coverage
        1/1/2011 to 31/12/2011
        1/1/2010 to 31/12/2010
        1/1/2012 to 31/12/2012
        1/1/2010 to 31/12/2010
        1/1/2011 to 31/12/2011
        1/1/2012 to 31/12/2012
        1/1/2010 to 31/12/2010
        1/1/2010 to 31/12/2010
        1/1/2009 to 31/12/2009"
        DF <- read.csv(text = Lines, check.names = FALSE, as.is = TRUE)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-11
          • 2016-11-29
          • 2016-08-02
          • 2020-02-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多