【问题标题】:Extract date elements from POSIXlt and put into data frame in R从 POSIXlt 中提取日期元素并放入 R 中的数据框中
【发布时间】:2011-11-14 18:49:07
【问题描述】:

我今天的第二个问题,也是我最后一次尝试使用 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

到底发生了什么?在将这些数据带入 R 进行分析之前,我最好使用 Python 或 Java 之类的东西来完成我需要对这些数据执行的所有数据操作吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    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
    

    【讨论】:

    • 谢谢!那工作得很好。我知道必须有一个简单的解决方案。
    • 这个解决方案有问题,查看下方。
    • @user1034797:这个解决方案没有问题。您假设我更改了 POSIXlt 对象的元素,但我没有。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        如果您使用的是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

        【讨论】:

          猜你喜欢
          • 2017-05-08
          • 2012-03-11
          • 1970-01-01
          • 2014-12-15
          • 2021-12-26
          • 1970-01-01
          • 2023-01-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多