首页 文章

从POSIXlt中提取日期元素并放入R中的数据框

提问于
浏览
13

我当天的第二个问题和我最后一次尝试使用R来清理这些数据 . 这是sitrep:

我有一个数据框,其中包含一个POSIXlt日期类型的列 . 我想从该列中提取日,月和年,并创建3个名为(巧妙地)日,月和年的新列 .

数据框如下所示:

order_id      dd_mmm_yy
   1          2005-07-28
   2          2007-03-04

我想最终得到这个:

order_id      dd_mmm_yy    day   month   year
   1          2005-07-28    28     7     2005
   2          2007-03-04    4      3     2007

我已经创建了一个函数来提取日,月和年并将它们返回到列表中(或者数据框,我已经尝试过了) .

extractdate = function (date) {
        day = format(date, format="%d")
        month = format(date, format="%m")
        year = format(date, format="%Y")

       list(day=day, month=month, year=year)
 }

以下是基于早期问题和问题我尝试过的内容:

cbind(orders, t(sapply(orders$dd_mmm_yy, extractdate)))

这给了我这个:

Error in data.frame(..., check.names = FALSE) : 
arguments imply differing number of rows: 5, 9

t(sapply ......本身给了我一些疯狂的理由:

day         month       year       
sec   Character,5 Character,5 Character,5
min   Character,5 Character,5 Character,5
hour  Character,5 Character,5 Character,5
mday  Character,5 Character,5 Character,5
mon   Character,5 Character,5 Character,5
year  Character,5 Character,5 Character,5
wday  Character,5 Character,5 Character,5
yday  Character,5 Character,5 Character,5
isdst Character,5 Character,5 Character,5

到底是怎么回事?我最好使用像Python或Java这样的东西来完成我需要对这些数据进行的所有数据操作,然后再将它带入R进行分析吗?

3 回答

  • 2

    POSIXlt 对象是9个组件的列表(有关详细信息,请参阅 ?POSIXlt 的“详细信息”部分) . 因为 dd_mmm_yy 列是 POSIXlt ,所以您不需要函数来提取组件 . 您只需按名称提取组件即可:

    orders$day <- orders$dd_mmm_yy$mday        # day of month
    orders$month <- orders$dd_mmm_yy$mon+1     # month of year (zero-indexed)
    orders$year <- orders$dd_mmm_yy$year+1900  # years since 1900
    orders
    #   order_id  dd_mmm_yy day month year
    # 1        1 2005-07-28  28     7 2005
    # 2        2 2007-03-04   4     3 2007
    
  • 9

    一个班轮使用 lubridate

    require(plyr); require(lubridate)
    mutate(mydf, date = ymd(dd_mmm_yy), day = day(date), 
      month = month(date), year = year(date))
    
      order_id  dd_mmm_yy       date day month year
    1        1 2005-07-28 2005-07-28  28     7 2005
    2        2 2007-03-04 2007-03-04   4     3 2007
    
  • 23

    试试这个(DF作为你的data.frame):

    extractdate <- function(date) {
        day <- format(date, format="%d")
        month <- format(date, format="%m")
        year <- format(date, format="%Y")
    
        cbind(day, month, year)
    }
    
    cbind(DF, extractdate(DF$dd_mmm_yy))
    

相关问题