Package: openet-refet-gee
This repository providesGoogle Earth EnginePython API based implementation of the ASCE Standardized Reference Evapotranspiration Equations (ASCE2005) for computing daily and hourly reference ET.UsageDailyThe following demonstrates how to compute a single daily ETr value using weather data for 2015-07-01 from theFallon, NV AgriMet station.
The necessary unit conversions are shown on the input values.
The raw input data is availablehere.import math
import ee
import openet.refetgee#Unitconversionstmin_c = (66.65 - 32) * (5.0 / 9)                          # F -> C
tmax_c = (102.80 - 32) * (5.0 / 9)                         # F -> C
tdew_c = (57.26 - 32) * (5.0 / 9)                          # F -> C
ea = 0.6108 * math.exp(17.27 * tdew_c / (tdew_c + 237.3))  # kPa
rs = (674.07 * 0.041868)                                   # Langleys -> MJ m-2 d-1
uz = 4.80 * 0.44704                                        # mpg -> m s-1
lat = 39.4575                                              # degrees

etr = openet.refetgee.Daily(
    tmin=tmin_c, tmax=tmax_c, ea=ea, rs=rs, uz=uz, zw=3, elev=1208.5,
    lat=lat, doy=182).etr.getInfo()

print('ETr: {:.2f} mm'.format(float(etr)))HourlyThe following demonstrates how to compute a single hourly ETr value using weather data for 18:00 UTC (11:00 AM PDT) on 2015-07-01 from theFallon, NV AgriMet station.
The necessary unit conversions are shown on the input values.
The raw input data is availablehereimport math
import ee
import openet.refetgee#Unitconversionstmean_c = (91.80 - 32) * (5.0 / 9)           # F -> C
ea = 1.20                                    # kPa
rs = (61.16 * 0.041868)                      # Langleys -> MJ m-2 h-1
uz = 3.33 * 0.44704                          # mph -> m s-1
lat = 39.4575                                # degrees
lon = -118.77388                             # degrees

etr = openet.refetgee.Hourly(
    tmean=tmean_c, ea=ea, rs=rs, uz=uz, zw=3, elev=1208.5,
    lat=lat, lon=lon, doy=182, time=18).etr.getInfo()

print('ETr: {:.2f} mm'.format(float(etr)))GRIDMETA helper function for computing daily ETo and ETr forGRIDMETimages is available.import ee
import openet.refetgee

source_img = ee.Image(ee.ImageCollection('IDAHO_EPSCOR/GRIDMET').first())
etr = openet.refetgee.Daily.gridmet(source_img).etr\
    .reduceRegion(reducer=ee.Reducer.first(),
                  geometry=ee.Geometry.Point(-118.77388, 39.4575),
                  scale=1000)\
    .getInfo()

print('ETr: {:.2f} mm'.format(float(etr['etr'])))NLDASHelper functions for computing daily/hourly ETo/ETr forNLDASimages are available.For the daily function, the NLDAS collection must be filtered to a single 24 hour period.import ee
import openet.refetgee

source_coll = ee.ImageCollection('NASA/NLDAS/FORA0125_H002')\
    .filterDate('2015-07-01', '2015-07-02')
etr = openet.refetgee.Daily.nldas(source_coll).etr\
    .reduceRegion(reducer=ee.Reducer.first(),
                  geometry=ee.Geometry.Point(-118.77388, 39.4575),
                  scale=1000)\
    .getInfo()

print('ETr: {:.2f} mm'.format(float(etr['etr'])))import ee
import openet.refetgee

source_img = ee.Image('NASA/NLDAS/FORA0125_H002/A20150701_2000')
etr = openet.refetgee.Hourly.nldas(source_img).etr\
    .reduceRegion(reducer=ee.Reducer.first(),
                  geometry=ee.Geometry.Point(-118.77388, 39.4575),
                  scale=1000)\
    .getInfo()

print('ETr: {:.2f} mm'.format(float(etr['etr'])))CFSv2A helper function for computing daily ETo and ETr forCFSv2images is available.For the daily function, the CFSv2 collection must be filtered to a single 24 hour period.import ee
import openet.refetgee

source_coll = ee.ImageCollection('NOAA/CFSV2/FOR6H')\
    .filterDate('2015-07-01', '2015-07-02')
etr = openet.refetgee.Daily.cfsv2(source_coll).etr\
    .reduceRegion(reducer=ee.Reducer.first(),
                  geometry=ee.Geometry.Point(-118.77388, 39.4575),
                  scale=1000)\
    .getInfo()

print('ETr: {:.2f} mm'.format(float(etr['etr'])))RTMAHelper functions for computing daily/hourly ETo/ETr forRTMAimages are available.For the daily function, the RTMA collection must be filtered to a single 24 hour period.import ee
import openet.refetgee

source_coll = ee.ImageCollection('NOAA/NWS/RTMA')\
    .filterDate('2015-07-01', '2015-07-02')
etr = openet.refetgee.Daily.rtma(source_coll).etr\
    .reduceRegion(reducer=ee.Reducer.first(),
                  geometry=ee.Geometry.Point(-118.77388, 39.4575),
                  scale=1000)\
    .getInfo()

print('ETr: {:.2f} mm'.format(float(etr['etr'])))import ee
import openet.refetgee

source_img = ee.Image('NOAA/NWS/RTMA/2015070120')
etr = openet.refetgee.Hourly.nldas(source_img).etr\
    .reduceRegion(reducer=ee.Reducer.first(),
                  geometry=ee.Geometry.Point(-118.77388, 39.4575),
                  scale=1000)\
    .getInfo()

print('ETr: {:.2f} mm'.format(float(etr['etr'])))ERA5-LandHelper functions for computing daily/hourly ETo/ETr forERA5-Landimages are available.For the daily function, the ERA5-Land collection must be filtered to a single 24 hour period.import ee
import openet.refetgee

source_coll = ee.ImageCollection('ECMWF/ERA5_LAND/HOURLY')\
    .filterDate('2015-07-01', '2015-07-02')
etr = openet.refetgee.Daily.era5_land(source_coll).etr\
    .reduceRegion(reducer=ee.Reducer.first(),
                  geometry=ee.Geometry.Point(-118.77388, 39.4575),
                  scale=1000)\
    .getInfo()

print('ETr: {:.2f} mm'.format(float(etr['etr'])))import ee
import openet.refetgee

source_img = ee.Image('ECMWF/ERA5_LAND/HOURLY/20150701T20')
etr = openet.refetgee.Hourly.era5_land(source_img).etr\
    .reduceRegion(reducer=ee.Reducer.first(),
                  geometry=ee.Geometry.Point(-118.77388, 39.4575),
                  scale=1000)\
    .getInfo()

print('ETr: {:.2f} mm'.format(float(etr['etr'])))Input ParametersRequired Parameters (hourly & daily)VariableTypeDescription [units]eaee.ImageActual vapor pressure [kPa]rsee.ImageIncoming shortwave solar radiation [MJ m-2 day-1]uzee.ImageWind speed [m s-1]zwee.NumberWind speed height [m]elevee.Image, ee.NumberElevation [m]latee.Image, ee.NumberLatitude [degrees]doyee.Image, ee.NumberDay of yearRequired Daily ParametersVariableTypeDescription [units]tminee.ImageMinimum daily temperature [C]tmaxee.ImageMaximum daily temperature [C]Required Hourly ParametersVariableTypeDescription [units]tmeanee.ImageAverage hourly temperature [C]lonee.Image, ee.NumberLongitude [degrees]timeee.NumberUTC hour at start of time periodOptional ParametersVariableTypeDescription [units]methodstrCalculation method‘asce’ – Calculations will follow ASCE-EWRI 2005 (default)‘refet’ – Calculations will follow RefET softwarerso_typestrOverride default clear sky solar radiation (Rso) calculationDefaults to None if not set‘full’ – Full clear sky solar formulation (default)‘simple’ – Simplified clear sky solar formulation (Eq. 19)‘array’ – Read Rso values from “rso” function parameterrsoee.Image, ee.NumberClear sky solar radiation [MJ m-2 day-1]Only needed if rso_type is ‘array’Defaults to None if not setIssuesCurrently the user must handle all of the file I/O and unit conversions.Cloudiness Fraction (hourly)The cloudiness fraction (fcd) is computed as the ratio of the measured solar radiation (Rs) to the theoretical clear sky solar radiation (Rso).  This ratio cannot be computed directly at night since Rso is 0.  ASCE-EWRI 2005 suggests computing a representative nighttime fcd based on the fcd at sunset and/or sunrise.In the RefET module fcd is hard coded to 1 for all time steps with very low sun angles since the hourly reference ET is computed independently for each time step.Calculation Method - ASCE vs. RefETThe main difference between the two “methods” is that the “asce” method attempts to follow the equations inASCE2005, whereas the “refet” method attempts to follow the calculations of theRefET Softwareas closely as possible.  The difference in output between these methods is generally negligible (if not identical for realistic numbers of significant digits).  Note that the default is set to “asce” to best match the calculations a user would expect to have happen. The “refet” method was added in order to help validate this code to the RefET Software.InstallationThe OpenET RefET GEE python module can be installed via pip:pip install openet-refet-geeOpenET Namespace PackageEach OpenET model is stored in the “openet” folder (namespace).  The model can then be imported as a “dot” submodule of the main openet module.import openet.refetgee as refetgeeValidationPlease see thevalidation documentfor additional details on the source of the test values and the comparison of the functions to the Ref-ET software.Dependenciesearthengine-apiModules needed to run the test suite:pandaspytestpytzReferences[ASCE2005]ASCE-EWRI (2005). The ASCE standardized reference evapotranspiration equation.https://ascelibrary.org/doi/book/10.1061/9780784408056