Я хотел бы перевести следующий javascript в Python, в котором код использует вложенную функцию .map (). Выводом является ImageCollection, который создает изображения с датой, такой как 2010/12, 2011/1 и т. Д.
var startyear = 2019;
var endyear = 2020;
var startdate = ee.Date.fromYMD(startyear,12,1);
var enddate = ee.Date.fromYMD(endyear,1,31)
var collection = ee.ImageCollection('COPERNICUS/S5P/OFFL/L3_NO2')
.filterDate(startdate, enddate)
var MonthlyMedian = ee.ImageCollection.fromImages(
years.map(function (y){
return months.map(function (m) {
var s = collection
.filter(ee.Filter.calendarRange(y, y, 'year'))
.filter(ee.Filter.calendarRange(m, m, 'month'))
return s.median()
.set('numbImages',s.size())
.set('month', m)
.set('year',y)
});
}).flatten());
Я пытался использовать лямбда-функцию, но безуспешно, потому что я не знаю, как передать два параметра в лямбду. В результате я написал следующую Python версию.
startyear = 2019;
endyear = 2020;
startdate = ee.Date.fromYMD(startyear,12,1);
enddate = ee.Date.fromYMD(endyear,1,31)
imgcollection = ee.ImageCollection('COPERNICUS/S5P/OFFL/L3_NO2').filterDate(startdate, enddate)
months = enddate.difference(startdate, 'month').round()
dates = ee.List.sequence(0, months.subtract(1), 1)
def make_datelist(n):
return startdate.advance(n, 'month')
dates = dates.map(make_datelist)
def getm(d):
d = ee.Date(d)
end = d.advance(1, 'month')
m = d.get('month')
y = d.get('year')
s = imgcollection.filterDate(d, end)
#OR
#s = imgcollection.filter(ee.Filter.calendarRange(y, y, 'year'))\
# .filter(ee.Filter.calendarRange(m, m, 'month'))
return s.mean()\
.set('numbImages', s.size())\
.set('month', m)\
.set('year', y)
list_of_images = dates.map(getm)
MonthlyCollection = ee.ImageCollection(list_of_images)
Я хотел бы спросить, можно ли дополнительно упростить сценарий python или заменить его лямбда-функцией.