如何使用R指定特定年份每个月的天数?

时间:2012-10-19 15:25:48

标签: r binary

我正在尝试计算每月产品(二进制文件)https://echange-fichiers.inra.fr/get?k=Jr3tvgeKnWUiC1B0MMY的年度总计。所以我有12个文件,我必须计算总和。下面给出的代码工作正常,但我需要的是将每个文件乘以对应于该年当月的天数,然后计算总和。对于我的情况,这些数据是2000年(闰年),所以我想将文件编号1的结果乘以31,将文件编号2的结果乘以29等等......

files<- list.files("C:\\jung file_2000_img", "*.img", full.names = TRUE)
x<- do.call(rbind,(lapply(files, readBin  , double() , size = 4 , n=360 * 720 , signed =TRUE)))
results <- colSums(x)
fileName <- sprintf("C:\\annual_ET2000_without999_1.img")
writeBin(as.double(results), fileName, size = 4)

根据Jame的回答,这将计算天数:

numDays <- function(month,year){
    as.numeric(strftime(as.Date(paste(year+month%/%12,month%%12+1,"01",sep="-"))-1,"%d"))
}

那么现在如何将其应用到我上面的代码中?我的意思是我想要为每个文件获取结果并将其乘以天数,如:

file1*numDays(1,2000)+file2*numDays(2,2000)+file3*numDays(3,2000)
   .............file12*numDays(12,2000) 

3 个答案:

答案 0 :(得分:4)

您可以从下个月的第一天开始向前移动一天。所以,试试这个:

numDays <- function(month,year){
  as.numeric(strftime(as.Date(paste(year+month%/%12,month%%12+1,"01",sep="-"))-1,"%d"))
}

测试:

numDays(2,2012)
 [1] 29
numDays(2,2011)
 [1] 28
numDays(1,2011)
 [1] 31
numDays(12,2011)
 [1] 31
# vector of all month days in year 2000
sapply(1:12,numDays,2000)
 [1] 31 29 31 30 31 30 31 31 30 31 30 31

答案 1 :(得分:3)

我建议您使用包lubridate,它对这些类型的东西有许多有用的功能。例如:

> lubridate::days_in_month(as.Date("2000-02-01"))
Feb 
 29 

答案 2 :(得分:1)

@James为您提供了查找一个月内天数的功能(您已将其纳入您的问题)。下一步是按月数对月度值进行加权。问题是你把所有的月份放在一起,没有办法分辨出其后的几个月。所以不要把它们结合得那么多:

files<- list.files("C:\\jung file_2000_img", "*.img", full.names = TRUE)
x<- lapply(files, readBin  , double() , size = 4 , n=360 * 720 , signed =TRUE)
results <- sapply(x, colSums)
ann.results <- sum(sapply(1:12, function(m) {results[[m]] * numDays(m, 2000)}))

这是一个很大的假设:files[[1]]对应于1月,files[[12]]对应于12月,所有对应于匹配。

这样做的是制作一个数据框列表,每个月一个。然后,它会在列表中使用colSums来生成一个包含每个月总计的向量(与files相同的顺序)。最后,将月份迭代到具有天数的相应results值的倍数(同样,假设这是正确的相应月份)。