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

19

今天的第二个问题,也是我最后一次尝试使用 R 来清理这个数据。以下是情况说明:

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

数据框如下:

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

到底发生了什么?在将数据带入R进行分析之前,我是否最好使用类似Python或Java的工具来处理所有需要进行的数据操作?

4个回答

27

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

谢谢!那个完美地解决了问题。我知道一定有一个简单的解决方案。 - Dave Kincaid
这个解决方案有问题,请查看以下。 - mmann1123
@user1034797:这个解决方案没有问题。你假设我改变了POSIXlt对象的元素,但实际上我并没有这样做。 - Joshua Ulrich

10

使用 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

4

试一试这个(将DF作为您的数据框):

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))

1
如果您正在使用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)])。您可以在这里查看完整文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接