Google Earth Engine – How to Filter Image Collection with a Month Range for Each Year

google-earth-engine

I have used the codes below to calculate the total annual for the image collection based on Calendar Year. Now I want to calculate the sum again using a water year, from 8/1/2018 to 8/31/2019 as one year for example.

How do I make my own annual range filter in Google Earth Engine?

> // Set start and end of time series

var startYear = 1981;

var endYear = 2019;

var regions = "municipio";

// Create a list of years by generating a sequence from start and end years 

var years = ee.List.sequence(startYear, endYear);


// Generate annual summed image mosaics 

var annualPrecip = ee.ImageCollection.fromImages(
  years.map(function (year) {
    var annual = chirps
        .filter(ee.Filter.calendarRange(year, year, 'year'))
        .sum();
    return annual
        .set('year', year)
        .set('system:time_start', ee.Date.fromYMD(year, 1, 1).format("YYYY_MM_dd"));
}));

Best Answer

Create two dates from ee.Date.fromYMD that represent the start and end of the water year in your mapped function. Add vars for water year start/end month and day; year is determined from the map-provided year. Use the given year for the start date and add 1 to year for the end date.

var startYear = 1981;
var endYear = 2019;
var regions = "municipio";
var startWaterMonth = 8;
var startWaterDay = 1;
var endWaterMonth = 8;
var endWaterDay = 31;

// Create a list of years by generating a sequence from start and end years 
var years = ee.List.sequence(startYear, endYear);

// Generate annual summed image mosaics 
var annualPrecip = ee.ImageCollection.fromImages(
  years.map(function (year) {
    var startDate = ee.Date.fromYMD(year, startWaterMonth, startWaterDay);
    var endDate = ee.Date.fromYMD(ee.Number(year).add(1), endWaterMonth, endWaterDay);
    var annual = chirps
      .filterDate(startDate, endDate)
      .sum();
    return annual
      .set('year', year)
      .set('system:time_start', ee.Date.fromYMD(year, 1, 1).format("YYYY_MM_dd"));
}));