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

时间:2011-11-14 18:49:08

标签: r

我当天的第二个问题以及我最后一次尝试使用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进行分析吗?

4 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分: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

答案 2 :(得分:2)

试试这个(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))

答案 3 :(得分:0)

如果您使用的是data.table软件包,它已经具有从POSIXct提取数据时间分量的功能。

second(x)
minute(x)
hour(x)
yday(x)
wday(x)
mday(x)
week(x)
isoweek(x)
month(x)
quarter(x)
year(x)

用法很简单(例如dt[, day := day(dd_mmm_yy)])。您可以查看完整的文档here