我有动物园对象,看起来像:
头(OBS)
Index pp
1932-01-01 0
1932-01-02 0.2
1932-01-03 0
Run Code Online (Sandbox Code Playgroud)
并且我想将索引拆分为3列(分别列中的年,月和日),因此我可以使用每月的每天进行一些分析ddply.
我不知道它是否有任何区别,但我的日期是使用以下方式创建的:
dates <- as.Date(CET[,1], "%d-%m-%Y")
obs <- xts(CET[,2], dates)
Run Code Online (Sandbox Code Playgroud)
其中CET是原始文件,第1列中的日期和第2列中的pp.
谢谢你的帮助!
G. *_*eck 16
1)列.我们可以使用lubridate的year/ month/ day或节段性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))
Run Code Online (Sandbox Code Playgroud)
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)))
Run Code Online (Sandbox Code Playgroud)
2)聚合.但是,我们并不需要首先创建列.我们可以aggregate.zoo直接使用原始动物园对象,z使用lubridate或chron或仅使用yearmon动物园,具体取决于您想要做什么:
2a)使用润滑剂聚集
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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
2c)使用yearmon聚合
如果我们希望总结每年/每月而不是将所有1月份的所有月份,2月份的所有月份等结合在一起,那么我们既不需要chron也不需要rubridate,而是可以使用zoo yearmon:
library(zoo)
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999)
aggregate(z, yearmon, mean)
Run Code Online (Sandbox Code Playgroud)
dtstr <- as.character( index(CET))
CET$yr <- sapply(strsplit(dtstr, "-") , "[", 1)
CET$mon <- sapply(strsplit(dtstr, "-") , "[", 2)
CET$dt <- sapply(strsplit(dtstr, "-") , "[", 3)
Run Code Online (Sandbox Code Playgroud)
你可以试试:
CET$year <- format(CET[,1], "%Y") # year
CET$month <- format(CET[,1], "%m") # month
CET$day <- format(CET[,1], "%d") # day
Run Code Online (Sandbox Code Playgroud)