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

时间:2012-10-24 17:37:32

标签: 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)

1 个答案:

答案 0 :(得分:4)

以下是此处使用的技巧:计算 next 月的第一个,然后返回一天以获取当前月的最后一天:< / p>

R> seq(as.Date("2000-02-01"), as.Date("2001-01-01"), by="1 month")
[1]  "2000-02-01" "2000-03-01" "2000-04-01" "2000-05-01" "2000-06-01" 
[6]  "2000-07-01" "2000-08-01" "2000-09-01" "2000-10-01" "2000-11-01" 
[11] "2000-12-01" "2001-01-01"
R> seq(as.Date("2000-02-01"), as.Date("2001-01-01"), by="1 month") - 1
[1]  "2000-01-31" "2000-02-29" "2000-03-31" "2000-04-30" "2000-05-31" 
[6]  "2000-06-30" "2000-07-31" "2000-08-31" "2000-09-30" "2000-10-31" 
[11] "2000-11-30" "2000-12-31"

然后使用具有'day of month'字段的POSIXlt表示:

R> as.POSIXlt(seq(as.Date("2000-02-01"), as.Date("2001-01-01"), 
+             by="1 month") - 1)$mday
[1] 31 29 31 30 31 30 31 31 30 31 30 31
R> sum(as.POSIXlt(seq(as.Date("2000-02-01"), as.Date("2001-01-01"), 
+                     by="1 month") - 1)$mday)
[1] 366
R>