每日时间序列 - 计算R中的总数

时间:2014-07-31 15:21:48

标签: r

我有一个包含30年日常数据的时间序列(两列标有日期和值)

Date        Value
01-01-1975  0.051
02-01-1975  0.051
03-01-1975  0.051
04-01-1975  0.051
05-01-1975  0.051
06-01-1975  0.051
07-01-1975  0.051
08-01-1975  0.051
09-01-1975  0.051
10-01-1975  0.048
11-01-1975  0.048
12-01-1975  0.048
.........

我试图将5天的总数合计为总和(因此,每年我会得到73个值,这是闰年,那么它的最后值将是6天而不是5天)换句话说我总是我希望从1月1日开始,每年12月31日结束,但我需要以某种方式处理闰年案例,例如通过单独处理每年或通过查找闰年并以不同方式对待它们。但我遇到了问题

我做了以下,

test <- read.csv("~/H/x.csv")
test$Date <- as.Date(test$Date, format = "%d-%m-%Y")
output <- aggregate(Flow ~ cut(Date, "5 days"), test, sum)

但它并没有给我我想要的结果,这是每年我想要计算73个值...

这是我第一次参加编程和R,所以非常欢迎您的指导

2 个答案:

答案 0 :(得分:0)

要播放的一些示例数据:

test = data.frame(Date=seq(as.Date("1975-01-01"),as.Date("2005-01-01"),1))
test$value = runif(nrow(test))
head(test)
        Date     value
1 1975-01-01 0.2929824
2 1975-01-02 0.2222665
3 1975-01-03 0.2659065
4 1975-01-04 0.5511573

现在使用lubridate包的yday函数将年中的日期设置为1到366:

> require(lubridate)
> test$yday = yday(test$Date)

现在整数除以年份减去1乘以5来给出我们的分组(在这种情况下从0到73):

> test$grp = (test$yday-1) %/% 5
head(test,10)
         Date      value yday grp
1  1975-01-01 0.29298243    0   0
2  1975-01-02 0.22226646    1   0
3  1975-01-03 0.26590648    2   0
4  1975-01-04 0.55115730    3   0
5  1975-01-05 0.55990854    4   0
6  1975-01-06 0.70054357    5   1
7  1975-01-07 0.27184097    6   1
8  1975-01-08 0.47779337    7   1
9  1975-01-09 0.09127241    8   1
10 1975-01-10 0.65023465    9   1

所以我们每年都有73组的奇怪日子。哪些?

test[test$grp==73,]
            Date     value yday grp
731   1976-12-31 0.6636329  365  73
2192  1980-12-31 0.4586537  365  73
3653  1984-12-31 0.3473794  365  73
5114  1988-12-31 0.9160449  365  73
6575  1992-12-31 0.3215585  365  73
8036  1996-12-31 0.1965876  365  73
9497  2000-12-31 0.6795412  365  73
10958 2004-12-31 0.3622685  365  73

我们想把这些放在第72组:

test$grp[test$grp==73]=72

现在我们可以根据该组变量进行分析,我们应该只得到73个值(记住我们从零开始)。我会使用dplyr,因为它很酷:

require(dplyr)
test %>% group_by(grp) %>% summarise(mean=mean(value))
Source: local data frame [73 x 2]

   grp      mean
1    0 0.5052336
2    1 0.5178286
3    2 0.4844037
4    3 0.5368534
5    4 0.4900208
6    5 0.5078784
7    6 0.4754043
....

73 x 2看起来正确!

答案 1 :(得分:0)

cut为5天,但请按年ave进行,以便数周不跨越年份。这给出了Date5。现在aggregate超过了切割值:

# test data
DF <- data.frame(Date = seq(as.Date("1975-01-01"), length = 2000, by = "day"), 
                 Value = 1:2000)

to.yr <- function(x) as.numeric(format(x, "%Y"))

Date5 <- ave(DF$Date, to.yr(DF$Date), FUN = function(x) cut(x, "5 day"))
ag <- aggregate(Value ~ Date5, DF, sum)

计算使用的周数(全部或部分):

> table(to.yr(ag$Date5))

1975 1976 1977 1978 1979 1980 
  73   74   73   73   73   35 
相关问题