Source code for act.discovery.surfrad
"""
Function for downloading data from
NOAA Surface Radiation Budget network
"""
from datetime import datetime
import os
try:
from urllib.request import urlopen
except ImportError:
from urllib import urlopen
[docs]def download_surfrad_data(site=None, startdate=None, enddate=None, output=None):
"""
Function to download data from the NOAA Surface Radiation Budget network.
https://gml.noaa.gov/grad/surfrad/
Parameters
----------
site : str
3 letter NOAA site identifier. Required variable
List of sites can be found at https://gml.noaa.gov/grad/surfrad/sitepage.html
startdate : str
The start date of the data to acquire. Format is YYYYMMDD. Required variable
enddate : str
The end date of the data to acquire. Format is YYYYMMDD
output : str
The output directory for the data. Set to None to make a folder in the
current working directory with the same name as *datastream* to place
the files in.
Returns
-------
files : list
Returns list of files retrieved
"""
if (site is None) or (startdate is None):
raise ValueError('site and startdate need to be set')
site = site.lower()
site_dict = {
'bnd': 'Bondville_IL',
'tbl': 'Boulder_CO',
'dra': 'Desert_Rock_NV',
'fpk': 'Fort_Peck_MT',
'gwn': 'Goodwin_Creek_MS',
'psu': 'Penn_State_PA',
'sxf': 'Sioux_Falls_SD',
}
site_name = site_dict[site]
# Convert dates to day of year (doy) for NOAA folder structure
s_doy = datetime.strptime(startdate, '%Y%m%d').timetuple().tm_yday
year = datetime.strptime(startdate, '%Y%m%d').year
if enddate is None:
enddate = startdate
e_doy = datetime.strptime(enddate, '%Y%m%d').timetuple().tm_yday
# Set base URL
url = 'https://gml.noaa.gov/aftp/data/radiation/surfrad/'
# Construct output directory
if output:
# Output files to directory specified
output_dir = os.path.join(output)
else:
# If no folder given, add datastream folder
# to current working dir to prevent file mix-up
output_dir = os.path.join(os.getcwd(), site_name + '_surfrad')
if not os.path.isdir(output_dir):
os.makedirs(output_dir)
# Set up doy ranges, taking into account changes for a new year
prev_doy = 0
if e_doy < s_doy:
r = list(range(s_doy, 366)) + list(range(1, e_doy + 1))
else:
r = list(range(s_doy, e_doy + 1))
# Set filename variable to return
filenames = []
# Loop through each doy in range
for doy in r:
# if the previous day is greater than current, assume a new year
# i.e. 365 -> 001
if prev_doy > doy:
year += 1
# Add filename to url
file = site + str(year)[2:4] + str(doy) + '.dat'
new_url = url + site_name + '/' + str(year) + '/' + file
# Write each file out to a file with same name as online
output_file = os.path.join(output_dir, file)
try:
print('Downloading ' + file)
with open(output_file, 'wb') as open_bytes_file:
open_bytes_file.write(urlopen(new_url).read())
filenames.append(output_file)
except Exception:
pass
prev_doy = doy
return filenames