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

从POSIXlt中提取日期元素并放入R中的数据帧中,r,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

我今天的第二个问题,也是我最后一次尝试使用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
我创建了一个函数来提取日、月和年,并将它们返回到列表(或数据框,我尝试了两者)

以下是我根据之前的一个问题所做的尝试:

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之类的工具来对这些数据进行所有需要的数据操作?

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


extractdate
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

订购$day使用
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

如果您使用的是
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)]
)。您可以查看完整的文档。

谢谢!这非常有效。我知道必须有一个简单的解决方案。此解决方案有问题,请检查下面的内容。@user1034797:此解决方案没有问题。您假设我更改了POSIXlt对象的元素,但我没有更改。
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
second(x)
minute(x)
hour(x)
yday(x)
wday(x)
mday(x)
week(x)
isoweek(x)
month(x)
quarter(x)
year(x)