代码之家  ›  专栏  ›  技术社区  ›  Joris Meys

如何将字符数据帧转换为相应的日期?

  •  1
  • Joris Meys  · 技术社区  · 15 年前

    我已经注意到有几次使用dates不允许使用R中常用的技巧,比如我有一个带有日期的dataframe数据(见下文),我想将完整的dataframe转换成一个date类。到目前为止,我能想到的唯一解决办法是:

    for (i in 1:ncol(Data)){
        Data[,i] <- as.Date(Data[,i],format="%d %B %Y")
    }
    

    这将提供具有正确结构的数据帧:

    > str(Data)
    'data.frame':   6 obs. of  4 variables:
     $ Rep1:Class 'Date'  num [1:6] 12898 12898 13907 13907 13907 ...
     $ Rep2:Class 'Date'  num [1:6] 13278 13278 14217 14217 14217 ...
     $ Rep3:Class 'Date'  num [1:6] 13600 13600 14340 14340 14340 ...
     $ Rep4:Class 'Date'  num [1:6] 13831 13831 14669 14669 14669 ...
    

    使用经典的apply方法会产生完全不同的效果。尽管所有变量都属于同一类,并且都属于同一类,但我无法获得正确类的数据帧或矩阵作为输出:

    > str(sapply(Data,as.Date,format="%d %B %Y"))
     num [1:6, 1:4] 12898 12898 13907 13907 13907 ...
     - attr(*, "dimnames")=List of 2
      ..$ : NULL
      ..$ : chr [1:4] "Rep1" "Rep2" "Rep3" "Rep4"
    > str(apply(Data,2,as.Date,format="%d %B %Y"))
     num [1:6, 1:4] 12898 12898 13907 13907 13907 ...
     - attr(*, "dimnames")=List of 2
      ..$ : NULL
      ..$ : chr [1:4] "Rep1" "Rep2" "Rep3" "Rep4"
    

    如果要在日期对象中再次变换这些矩阵,则需要一个原点。来源可能因系统而异,因此使用截止日期或者apply()之后的另一个函数也没有多大帮助。如果你应用原点,你会得到一个向量。

    Data <- structure(list(Rep1 = c(" 25 April 2005 ", " 25 April 2005 ", 
    " 29 January 2008 ", " 29 January 2008 ", " 29 January 2008 ", 
    " 29 January 2008 "), Rep2 = c(" 10 May 2006 ", " 10 May 2006 ", 
    " 4 December 2008 ", " 4 December 2008 ", " 4 December 2008 ", 
    " 4 December 2008 "), Rep3 = c(" 28 March 2007 ", " 28 March 2007 ", 
    " 6 April 2009 ", " 6 April 2009 ", " 6 April 2009 ", " 6 April 2009 "
    ), Rep4 = c(" 14 November 2007 ", " 14 November 2007 ", " 1 March 2010 ", 
    " 1 March 2010 ", " 1 March 2010 ", " 1 March 2010 ")), .Names = c("Rep1", 
    "Rep2", "Rep3", "Rep4"), row.names = c("1", "2", "3", "4", "5", 
    "6"), class = "data.frame")
    
    2 回复  |  直到 15 年前
        1
  •  3
  •   Marek    15 年前

    怎么样

    str(as.data.frame(lapply(Data,as.Date,format="%d %B %Y")))
    # 'data.frame':   6 obs. of  4 variables:
    #  $ Rep1:Class 'Date'  num [1:6] 12898 12898 13907 13907 13907 ...
    #  $ Rep2:Class 'Date'  num [1:6] 13278 13278 14217 14217 14217 ...
    #  $ Rep3:Class 'Date'  num [1:6] 13600 13600 14340 14340 14340 ...
    #  $ Rep4:Class 'Date'  num [1:6] 13831 13831 14669 14669 14669 ...
    
        2
  •  5
  •   Collin    15 年前

    我认为最简洁的方法是:

    Data[] <- lapply(Data, as.Date,format="%d %B %Y")
    

    Data[date_col] <- lapply(Data[date_col], as.Date,format="%d %B %Y")
    

    您还可以使用其他几个包简化日期解析

    library(stringr)
    library(lubridate)
    Data[] <- lapply(Data, function(x) dmy(str_trim(x)))
    

    这有点冗长,但有一个优点,您不需要自己找出数据格式。