按月汇总 modis 列表文件

Aggregate modis list files by month

我正在寻找一种更有效的方法来按月将时间序列 (2002-2016) 中的每一年分开。我已经手工完成了,但是需要很多时间。

mypath<-"D:/SNOWL"
myras<-list.files(path=mypath,pattern = glob2rx("*.tif$"), 
                    full.names = TRUE, recursive = TRUE)

> myras
   [1] "D:/SNOWL/MOYDSL10A1.A2002001.tif" "D:/SNOWL/MOYDSL10A1.A2002002.tif"
   [3] "D:/SNOWL/MOYDSL10A1.A2002003.tif" "D:/SNOWL/MOYDSL10A1.A2002004.tif"
   [5] "D:/SNOWL/MOYDSL10A1.A2002005.tif" "D:/SNOWL/MOYDSL10A1.A2002006.tif"
   [7] "D:/SNOWL/MOYDSL10A1.A2002007.tif" "D:/SNOWL/MOYDSL10A1.A2002008.tif"
   [9] "D:/SNOWL/MOYDSL10A1.A2002009.tif" "D:/SNOWL/MOYDSL10A1.A2002010.tif"
  [11] "D:/SNOWL/MOYDSL10A1.A2002011.tif" "D:/SNOWL/MOYDSL10A1.A2002012.tif"

serie<-orgTime(myras, nDays = "asIn", begin ="2002-01-01",end = "2016-12-31", pillow = 75, pos1 = 13, pos2 = 19)
filter<-serie$inputLayerDates 

> filter
   [1] "2002-01-01" "2002-01-02" "2002-01-03" "2002-01-04" "2002-01-05"
   [6] "2002-01-06" "2002-01-07" "2002-01-08" "2002-01-09" "2002-01-10"
  [11] "2002-01-11" "2002-01-12" "2002-01-13" "2002-01-14" "2002-01-15"
  [16] "2002-01-16" "2002-01-17" "2002-01-18" "2002-01-19" "2002-01-20"
  [21] "2002-01-21" "2002-01-22" "2002-01-23" "2002-01-24" "2002-01-25"
  [26] "2002-01-26" "2002-01-27" "2002-01-28" "2002-01-29" "2002-01-30"
  [31] "2002-01-31" "2002-02-01" "2002-02-02" "2002-02-03" "2002-02-04"
  [36] "2002-02-05" "2002-02-07" "2002-02-08" "2002-02-09" "2002-02-10"
  [41] "2002-02-11" "2002-02-12" "2002-02-13" "2002-02-14" "2002-02-15"

编辑:

好的,让我们尝试一个全尺寸示例,看看它是否适合您:

# Here we generate filenames as returned from `list.files`:


rm(list = ls())

myras <- sapply(1:5465, function(i) paste0('D:/SNOWL/MOYDSL10A1.A',sample(2000:2016,1),sample(c(paste0('00',1:9),paste0('0',10:99),100:365),1),'.tif'))

head(myras)


# Let's extract the timestamps

tstmps <- regmatches(myras,regexpr('[[:digit:]]{7}',myras))

head(tstmps,50)

# And now convert the timestamps to dates 

dates <- as.Date(as.numeric(substr(tstmps,5,7)) - 1, origin = paste0(substr(tstmps,1,4),"-01-01"))

head(dates,10)


# Last step is to sort the files by month

#check months
print(month.name)

myras_byM = sapply(month.name,function(x) myras[months(dates) == x])

head(myras_byM$January)
head(myras_byM$February)
head(myras_byM$March)
head(myras_byM$April)
head(myras_byM$May)
head(myras_byM$June)
head(myras_byM$July)
head(myras_byM$August)
head(myras_byM$September)
head(myras_byM$October)
head(myras_byM$November)
head(myras_byM$December)


如果您有一致的命名约定,您可以轻松地从文件名中获取日期。

在你的例子中,我看到文件是按年份和年份排序的。所以只要从文件名中去掉日期,然后你就可以根据需要过滤它。为此,我使用了正则表达式。在这种情况下,我对日期和 DOY 字符串感兴趣,它们应该始终是 7 个数字。因此对应的 RE 为 [[:digit:]]{7},表示 7 个连续的数字。 regexpr 找到匹配项并 regmatches return 匹配它们。

dts <- regmatches(myras,regexpr('[[:digit:]]{7}',myras))

然后您只需使用 substring 来提取您需要的数字(此方法假设年份始终为 4 位数字,然后是 DOY 的 3 位数字)并将其转换为日期:

dts <-as.Date(as.numeric(substr(dts,5,7)) - 1, origin = paste0(substr(dts,1,4),"-01-01"))

这将为您提供示例中的 filter 变量。

如果您随后想按月对整个时间序列进行排序,您可以使用 sapply 或 lapply 以及内置名称 month.name。基本函数 months 将 return 给定日期的月份名称:

myras_byMonth <- sapply(month.name,function(x) myras[months(dts) == x])

希望我正确理解了你的问题,这正是你要找的。

最佳,