将日期分为年,月和日的不同列

时间:2011-07-01 16:32:26

标签: r date

我有动物园对象,如:

头(OBS)

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

我希望将索引拆分为3列(单独列中的年,月和日),以便我可以使用ddply每月进行一些分析。

我不知道它是否有任何区别,但我的日期是使用以下方式创建的:

dates <- as.Date(CET[,1], "%d-%m-%Y")
obs <- xts(CET[,2], dates)

其中CET是原始文件,第1列中的日期和第2列中的pp。

感谢您的帮助!

4 个答案:

答案 0 :(得分:16)

1)。我们可以使用lubridate的year / month / day或chron的month.day.year

1a)列通过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)列通过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.zoo使用原始动物园对象z,使用lubridate或chron,或者只使用动物园中的yearmon,具体取决于您想要做什么:

2a)使用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)使用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)使用yearmon聚合

如果我们希望总结每年/每月,而不是将所有一月份的所有月份,所有二月份一起等等,那么我们既不需要chron也不需要rubridate,而是可以使用zoo yearmon

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

aggregate(z, yearmon, mean)

答案 1 :(得分:7)

dtstr <- as.character( index(CET))

CET$yr <- sapply(strsplit(dtstr, "-") , "[", 1)
CET$mon <- sapply(strsplit(dtstr, "-") , "[", 2)
CET$dt <- sapply(strsplit(dtstr, "-") , "[", 3)

答案 2 :(得分:5)

您可以尝试:

CET$year <- format(CET[,1], "%Y") # year
CET$month <- format(CET[,1], "%m") # month
CET$day <- format(CET[,1], "%d") # day

答案 3 :(得分:2)

require(lubridate)
maindata1 <- cbind(maindata1, day=day(maindata1$Date), month=month(maindata1$date), year=year(maindata1$date))