Split date into different columns for year, month and day

后端 未结 4 2013
醉话见心
醉话见心 2020-11-27 21:21

I have zoo objects that look like:

head(obs)

      Index pp
1932-01-01  0
1932-01-02  0.2
1932-01-03  0

and I want to split the ind

4条回答
  •  無奈伤痛
    2020-11-27 22:04

    1) columns. We can use lubridate's year/month/day or chron's month.day.year:

    1a) columns via lubridate

    library(zoo)
    z <- zoo(1:1000, as.Date("1932-01-01") + 0:999)
    
    library(lubridate)
    tt <- time(z)
    zz <- cbind(z, year = year(tt), month = month(tt), day = day(tt))
    

    1b) columns via chron

    library(zoo)
    z <- zoo(1:1000, as.Date("1932-01-01") + 0:999)
    
    library(chron)
    zz <- with(month.day.year(time(z)), zoo(cbind(z, day, month, year)))
    

    2) aggregate. However, we do not really need to create columns in the first place. We can just use aggregate.zoo directly with the original zoo object, z, using lubridate or chron or just using yearmon from zoo depending on what it is that you want to do:

    2a) aggregate using lubridate

    library(zoo)
    z <- zoo(1:1000, as.Date("1932-01-01") + 0:999)
    
    library(lubridate)
    aggregate(z, day, mean)
    aggregate(z, month, mean)
    aggregate(z, year, mean)
    

    2b) aggregate using chron

    library(zoo)
    z <- zoo(1:1000, as.Date("1932-01-01") + 0:999)
    
    library(chron)
    mdy <- month.day.year(time(z))
    
    aggregate(z, mdy$day, mean)
    aggregate(z, mdy$month, mean)
    aggregate(z, mdy$year, mean)
    
    # or
    ct <- as.chron(time(z))
    
    aggregate(z, days(ct), mean)
    aggregate(z, months(ct), mean)
    aggregate(z, years(ct), mean)
    
    # days(ct) and years(ct) can actually
    # be shortened to just days and years within the above context
    # (and that would work for months too except they would be out of order)
    aggregate(z, days, mean)
    aggregate(z, years, mean)
    

    2c) aggregate using yearmon

    If we wish to summarize each year/month rather than lumping all January months together, all February months together, etc. then we need neither chron nor lubridate but rather can use zoo's yearmon:

    library(zoo)
    z <- zoo(1:1000, as.Date("1932-01-01") + 0:999)
    
    aggregate(z, yearmon, mean)
    

提交回复
热议问题