longitude[j, i + 1], latitude[j, i + 1]) dx[:, i + 1] = dx[:, i] xdiff_sign = np.sign(longitude[0, 1] - longitude[0, 0]) ydiff_sign = np.sign(latitude[1, 0] - latitude[0, 0]) return xdiff_sign * dx * units.meter, ydiff_sign * dy * units.meter ############################################### # Create NCSS object to access the NetcdfSubset # --------------------------------------------- # Data from NOMADS GFS 0.5 deg Analysis Archive # https://www.ncdc.noaa.gov/data-access/model-data/model-datasets/global-forcast-system-gfs dt = datetime(2017, 4, 5, 12) ncss = NCSS( 'https://nomads.ncdc.noaa.gov/thredds/ncss/grid/gfs-004-anl/' '{0:%Y%m}/{0:%Y%m%d}/gfsanl_4_{0:%Y%m%d}_{0:%H}00_000.grb2'.format(dt)) # Create lat/lon box for location you want to get data for query = ncss.query().time(dt) query.lonlat_box(north=65, south=15, east=310, west=220) query.accept('netcdf4') # Request data for vorticity query.variables('Geopotential_height', 'Temperature', 'U-component_of_wind', 'V-component_of_wind') data = ncss.get_data(query) # Pull out variables you want to use hght_var = data.variables['Geopotential_height'] temp_var = data.variables['Temperature']
for j in range(latitude.shape[0]): _, _, dx[j, i] = g.inv(longitude[j, i], latitude[j, i], longitude[j, i + 1], latitude[j, i + 1]) dx[:, i + 1] = dx[:, i] xdiff_sign = np.sign(longitude[0, 1] - longitude[0, 0]) ydiff_sign = np.sign(latitude[1, 0] - latitude[0, 0]) return xdiff_sign * dx * units.meter, ydiff_sign * dy * units.meter ###################################### # Set up access to the data # Create NCSS object to access the NetcdfSubset ncss = NCSS( 'https://nomads.ncdc.noaa.gov/thredds/ncss/grid/gfs-004-anl/201608/20160822/' 'gfsanl_4_20160822_1800_003.grb2') # Create lat/lon box for location you want to get data for query = ncss.query() query.lonlat_box(north=50, south=30, east=-80, west=-115) query.time(datetime(2016, 8, 22, 21)) # Request data for geopotential height query.variables('Geopotential_height', 'U-component_of_wind', 'V-component_of_wind') query.vertical_level(100000) data = ncss.get_data(query) # Pull out variables you want to use height_var = data.variables['Geopotential_height']
from metpy.units import units from netCDF4 import num2date import numpy as np import numpy.ma as ma from scipy.ndimage import gaussian_filter from siphon.ncss import NCSS ########################### # **Get the data** # # This example will use data from the North American Mesoscale Model Analysis # (https://nomads.ncdc.gov/) for 12 UTC 27 April 2011. base_url = 'https://www.ncei.noaa.gov/thredds/ncss/grid/namanl/' dt = datetime(2011, 4, 27) ncss = NCSS('{}{dt:%Y%m}/{dt:%Y%m%d}/namanl_218_{dt:%Y%m%d}_' '1800_000.grb'.format(base_url, dt=dt)) # Query for required variables gfsdata = ncss.query().all_times() gfsdata.variables( 'Geopotential_height_isobaric', 'u-component_of_wind_isobaric', 'v-component_of_wind_isobaric', 'Temperature_isobaric', 'Relative_humidity_isobaric', 'Best_4_layer_lifted_index_layer_between_two_pressure_' 'difference_from_ground_layer', 'Absolute_vorticity_isobaric', 'Pressure_reduced_to_MSL_msl', 'Dew_point_temperature_height_above_ground').add_lonlat() # Set the lat/lon box for the data to pull in. gfsdata.lonlat_box(-135, -60, 15, 65)
def give_me_latest_gfs(): best_gfs = 'http://thredds.ucar.edu/thredds/catalog/grib/NCEP/GFS/Global_0p5deg/catalog.xml' latest_gfs = get_latest_access_url(best_gfs, "NetcdfSubset") ncss = NCSS(latest_gfs) return ncss
import matplotlib.pyplot as plt import metpy.calc as mcalc from metpy.units import units from netCDF4 import num2date import numpy as np import numpy.ma as ma from scipy.ndimage import gaussian_filter from siphon.ncss import NCSS ########################### # **Get the data** # # This example will use data from the North American Mesoscale Model Analysis # (https://nomads.ncdc.gov/) for 12 UTC 27 April 2011. ncss = NCSS( 'https://nomads.ncdc.noaa.gov/thredds/ncss/grid/namanl/201104/20110427/' 'namanl_218_20110427_1800_000.grb') # Query for required variables gfsdata = ncss.query().all_times() gfsdata.variables('Geopotential_height', 'u_wind', 'v_wind', 'Temperature', 'Relative_humidity', 'Best_4-layer_lifted_index', 'Absolute_vorticity', 'Pressure_reduced_to_MSL', 'Dew_point_temperature').add_lonlat() # Set the lat/lon box for the data to pull in. gfsdata.lonlat_box(-135, -60, 15, 65) # Actually getting the data data = ncss.get_data(gfsdata)
from netCDF4 import num2date import numpy as np from metpy.units import units import scipy.ndimage as ndimage from siphon.catalog import TDSCatalog from siphon.ncss import NCSS # ============================================================================= # RETRIEVE RAP AND HRRR DATA # ============================================================================= RAP = 'http://thredds-jetstream.unidata.ucar.edu/thredds/catalog/grib/NCEP/RAP/CONUS_20km/latest.xml' HRRR= 'http://thredds-jetstream.unidata.ucar.edu/thredds/catalog/grib/NCEP/HRRR/CONUS_2p5km/latest.xml' GFS = 'http://thredds-jetstream.unidata.ucar.edu/thredds/catalog/grib/NCEP/GFS/Global_0p5deg/latest.xml' DATA = TDSCatalog(GFS) BEST_DATA = list(DATA.datasets.values())[0] NCSS_DATA = NCSS(BEST_DATA.access_urls['NetcdfSubset']) NOW = datetime.utcnow() LATEST_DATA = NCSS_DATA.query().time(NOW).accept('netcdf4') # ============================================================================= # UPPER-AIR VARIABLES # ============================================================================= # 250: JET STREAM, GEOPOTENTIAL HEIGHT, POTENTIAL VORTICITY, IRROTATIONAL WIND def 250hPa_GFS_jet_stream_SLP(lon_west, lon_east, lat_south, lat_north): def 250hPa_GFS_jet_stream_jet_dyn(lon_west, lon_east, lat_south, lat_north): # 500: VORTICITY, GEOPOTENTIAL HEIGHT, VORTICITY ADVECTION def 500hPa_GFS_vorticity(lon_west, lon_east, lat_south, lat_north): LATEST_DATA.variables('Geopotential_height_isobaric', 'u-component_of_wind_isobaric', 'v-component_of_wind_isobaric').add_lonlat() LATEST_DATA.lonlat_box(lon_west, lon_east, lat_south, lat_north) LATEST_DATA.vertical_level(50000)
import cartopy.feature as cfeature import matplotlib.gridspec as gridspec import matplotlib.pylab as plt import metpy.calc as mpcalc from metpy.units import units from netCDF4 import num2date import numpy as np import scipy.ndimage as ndimage from siphon.ncss import NCSS ####################################### # Data Aquisition # --------------- # Open the example netCDF data ncss = NCSS('https://www.ncei.noaa.gov/thredds/ncss/grid/namanl/' '201604/20160416/namanl_218_20160416_1800_000.grb') now = datetime.utcnow() # Query for Latest GFS Run hgt = ncss.query().time(datetime(2016, 4, 16, 18)).accept('netcdf') hgt.variables('Geopotential_height_isobaric', 'u-component_of_wind_isobaric', 'v-component_of_wind_isobaric').add_lonlat() # Actually getting the data ds = ncss.get_data(hgt) lon = ds.variables['lon'][:] lat = ds.variables['lat'][:] times = ds.variables[ ds.variables['Geopotential_height_isobaric'].dimensions[0]]
for j in range(latitude.shape[0]): _, _, dx[j, i] = g.inv(longitude[j, i], latitude[j, i], longitude[j, i + 1], latitude[j, i + 1]) dx[:, i + 1] = dx[:, i] xdiff_sign = np.sign(longitude[0, 1] - longitude[0, 0]) ydiff_sign = np.sign(latitude[1, 0] - latitude[0, 0]) return xdiff_sign * dx * units.meter, ydiff_sign * dy * units.meter ####################################### # Data Aquisition # --------------- # Open the example netCDF data ncss = NCSS('http://nomads.ncdc.noaa.gov/thredds/ncss/grid/namanl/' '201604/20160416/namanl_218_20160416_1800_000.grb') now = datetime.utcnow() # Query for Latest GFS Run hgt = ncss.query().time(datetime(2016, 4, 16, 18)).accept('netcdf') hgt.variables('Geopotential_height', 'u_wind', 'v_wind').add_lonlat() # Actually getting the data ds = ncss.get_data(hgt) lon = ds.variables['lon'][:] lat = ds.variables['lat'][:] times = ds.variables[ds.variables['Geopotential_height'].dimensions[0]] vtime = num2date(times[:], units=times.units)
from metpy.units import units import metpy.calc as mpcalc from netCDF4 import num2date import numpy as np from siphon.catalog import TDSCatalog from siphon.ncss import NCSS import scipy.ndimage as ndimage gfs = TDSCatalog('http://atm.ucar.edu/thredds/catalog/grib/' 'NCEP/GFS/Global_0p25deg/catalog.xml') dataset = list(gfs.datasets.values())[1] print(dataset.access_urls) # Create NCSS object to access the NetcdfSubset ncss = NCSS(dataset.access_urls['NetcdfSubset']) # get current date and time now = datetime.utcnow() now = datetime(now.year, now.month, now.day, now.hour) # define time range you want the data for start = now end = now + timedelta(hours=12) query = ncss.query() query.time_range(start, end) # query.lonlat_box(north=70, south=20, east=310., west=230.) query.accept('netcdf4') query.variables('Temperature_surface', 'Relative_humidity_entire_atmosphere_single_layer',
def setup(self): """Set up for tests with a default valid query.""" dt = datetime(2015, 6, 12, 15, 0, 0) self.ncss = NCSS(self.server + self.url_path) self.nq = self.ncss.query().lonlat_point(-105, 40).time(dt) self.nq.variables('Temperature_isobaric', 'Relative_humidity_isobaric')
cmap=colormap, transform=ccrs.PlateCarree()) cax = plt.subplot(gs[1]) cbar = plt.colorbar(contourfill, cax=cax, orientation='horizontal', extend='max', extendrect=True) # Latest GFS Dataset cat = TDSCatalog('http://thredds.ucar.edu/thredds/catalog/grib/' 'NCEP/GFS/Global_0p5deg/latest.xml') #cat.datasets = [GFS_Global_0p5deg_20201128_1200.grib2] best_ds = list(cat.datasets.values())[0] ncss = NCSS(best_ds.access_urls['NetcdfSubset']) #NetCDF subset service object now = datetime.utcnow() data_hght = queryData(ncss, "height") data_wind = queryData(ncss, "wind") latitudes = data_hght.variables['lat'][:] longitudes = data_hght.variables['lon'][:] heights250hPa = data_hght.variables['Geopotential_height_isobaric'][:] # Smooth the 250-hPa heights using a gaussian filter from scipy.ndimage hgt_250, longitudes = cutil.add_cyclic_point(heights250hPa, coord=longitudes) Z_250 = ndimage.gaussian_filter(hgt_250[0, 0, :, :], sigma=3, order=0) u250 = (units(data_wind.variables['u-component_of_wind_isobaric'].units) *
# Helper function for finding proper time variable def find_time_var(var, time_basename='time'): for coord_name in var.coordinates.split(): if coord_name.startswith(time_basename): return coord_name raise ValueError('No time variable found for ' + var.name) ############################################### # Create NCSS object to access the NetcdfSubset # --------------------------------------------- # Data from NCEI GFS 0.5 deg Analysis Archive base_url = 'https://www.ncei.noaa.gov/thredds/ncss/grid/gfs-g4-anl-files/' dt = datetime(2018, 1, 4, 12) ncss = NCSS('{}{dt:%Y%m}/{dt:%Y%m%d}/gfsanl_4_{dt:%Y%m%d}' '_{dt:%H}00_000.grb2'.format(base_url, dt=dt)) # Create lat/lon box for location you want to get data for query = ncss.query().time(dt) query.lonlat_box(north=65, south=15, east=310, west=220) query.accept('netcdf') # Request data for model "surface" data query.variables('Pressure_reduced_to_MSL_msl', 'Apparent_temperature_height_above_ground', 'u-component_of_wind_height_above_ground', 'v-component_of_wind_height_above_ground') data = ncss.get_data(query) ############################################### # Begin data maipulation
def get_ensemble_point(point, variables=['Temperature_height_above_ground_ens'], start=datetime.utcnow() - timedelta(hours=12), end=datetime.utcnow() + timedelta(hours=48)): """ Retrieves the latest ("best") ensemble forecast valid at a single point from the Unidata THREDDS server using the Unidata siphon library. Requires: point -> A tuple of (lat, lon) of the point we are trying to retrieve variables -> A list of variables we want to retrieve. Check this page for a full list: http://thredds.ucar.edu/thredds/metadata/grib/NCEP/GEFS/Global_1p0deg_Ensemble/members/Best?metadata=variableMap start -> A datetime object of the earliest time to look for an ensemble initialization, default is current time minus 12 hours end -> The last time for which we want ensemble forecast output. Default is current time plus 48 hours. Returns: A dictionary with one item being the list of valid times in the data ('times') and the rest of the items being numpy arrays of nTimes x nEnsmems for each variable requested """ # Import the Siphon utilities from siphon.catalog import TDSCatalog from siphon.ncss import NCSS # In Siphon, we connect to a thredds catalog. Here's the address for the GEFS catalog = 'http://thredds.ucar.edu/thredds/catalog/grib/NCEP/GEFS/Global_1p0deg_Ensemble/members/catalog.xml' best_model = TDSCatalog(catalog) # We select a specific dataset in this catalog, in this case the "best" (most recent) ensemble run best_ds = list(best_model.datasets.values())[2] ncss = NCSS(best_ds.access_urls['NetcdfSubset']) # Here we format our subsetting query. We specify the exact point we want, # the time range, and the variables we are requesting. We're also going # to retrieve the data in a netcdf-like format query = ncss.query() query.lonlat_point(point[1], point[0]) query.time_range(start, end) query.variables(*variables) query.accept('netcdf') # Actually get the data data = ncss.get_data(query) # Format our output into a dictionary output = {} for v in variables: # After the squeeze, this is a nTimes x nEns array output[v] = np.squeeze(data.variables[v][:]) #print output[v].shape # Also, add times # The 'time' variable is hours since "time_coverage_start" # Get this in datetime format raw_hours = list(np.squeeze(data.variables['time'][:])) init_time = datetime.strptime(str(data.time_coverage_start), '%Y-%m-%dT%H:%M:%SZ') output['times'] = [init_time + timedelta(hours=int(x)) for x in raw_hours] # Return a dictionary return output
from ipywidgets import interact_manual import matplotlib.pyplot as plt import metpy.calc as mcalc from metpy.units import units from netCDF4 import num2date import numpy as np from siphon.ncss import NCSS ####################################### # **Getting the data** # # In this example, NARR reanalysis data for 18 UTC 04 April 1987 from the National Centers # for Environmental Information (https://nomads.ncdc.noaa.gov) will be used. # Link to NetCDF subset service for NAM analysis data ncss = NCSS('https://nomads.ncdc.noaa.gov/thredds/ncss/grid/narr-a/198704/19870404/' 'narr-a_221_19870404_1800_000.grb') # Bring in needed data modeldata = ncss.query().all_times() modeldata.variables('Geopotential_height', 'u_wind', 'v_wind', 'Temperature', 'Specific_humidity').add_lonlat() # Set the lat/lon box for the data you want to pull in. # lonlat_box(north_lat,south_lat,east_lon,west_lon) modeldata.lonlat_box(-140, -60, 16, 60) # Actually getting the data data = ncss.get_data(modeldata)
def setup(self): dt = datetime(2015, 6, 12, 15, 0, 0) self.ncss = NCSS(self.server + self.urlPath) self.nq = self.ncss.query().lonlat_point(-105, 40).time(dt) self.nq.variables('Temperature_isobaric', 'Relative_humidity_isobaric')
'\n' + str(np.int(data[mxy[i], mxx[i]])), color=color, size=12, clip_on=True, fontweight='bold', horizontalalignment='center', verticalalignment='top', transform=transform) ############################### # Get NARR data dattim = datetime(1999, 1, 3, 0) ncss = NCSS( 'https://www.ncei.noaa.gov/thredds/ncss/grid/narr-a-files/{0:%Y%m}/{0:%Y%m%d}/' 'narr-a_221_{0:%Y%m%d}_{0:%H}00_000.grb'.format(dattim)) query = ncss.query() query.all_times().variables( 'Pressure_reduced_to_MSL_msl', 'Geopotential_height_isobaric').add_lonlat().accept('netcdf') data = ncss.get_data(query) ############################### # Extract data into variables # Grab pressure levels plev = list(data.variables['isobaric1'][:]) # Grab lat/lons and make all lons 0-360 lats = data.variables['lat'][:]
from metpy.calc import get_wind_components from metpy.calc import reduce_point_density from metpy.cbook import get_test_data from metpy.plots import add_metpy_logo, StationPlot from metpy.plots.wx_symbols import current_weather, sky_cover, wx_code_map from metpy.units import units # Request METAR data from TDS metar = TDSCatalog('http://thredds.ucar.edu/thredds/catalog/nws/metar/' 'ncdecoded/catalog.xml') dataset = list(metar.datasets.values())[0] print(list(dataset.access_urls)) # Access netcdf subset and use siphon to request data ncss_url = dataset.access_urls['NetcdfSubset'] ncss = NCSS(ncss_url) print(ncss.variables) # get current date and time now = datetime.utcnow() now = datetime(now.year, now.month, now.day, now.hour) # define time range you want the data for start = now - timedelta(days=1) end = now # build the query query = ncss.query() query.lonlat_box(-5.5, 31.8, 42.7, 52.5) query.time(now) query.variables('air_temperature', 'dew_point_temperature', 'wind_speed',
import cartopy.feature as cfeature import cartopy.util as cutil import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt import metpy.calc as mpcalc from netCDF4 import num2date import numpy as np import scipy.ndimage as ndimage from siphon.catalog import TDSCatalog from siphon.ncss import NCSS # Latest GFS Dataset cat = TDSCatalog('http://thredds.ucar.edu/thredds/catalog/grib/' 'NCEP/GFS/Global_0p5deg/latest.xml') best_ds = list(cat.datasets.values())[0] ncss = NCSS(best_ds.access_urls['NetcdfSubset']) # Set the time to current now = datetime.utcnow() # Query for Latest GFS Run gfsdata = ncss.query().time(now).accept('netcdf4') gfsdata.variables('Geopotential_height_isobaric', 'u-component_of_wind_isobaric', 'v-component_of_wind_isobaric').add_lonlat() # Set the lat/lon box for the data you want to pull in. # lonlat_box(north_lat,south_lat,east_lon,west_lon) gfsdata.lonlat_box(0, 360, 0, 90) # Set desired level 50000 = 50000 Pa = 500 hPa
%matplotlib inline # <headingcell level=2> # Extract HRRR data using Unidata's Siphon package # <codecell> # Resolve the latest HRRR dataset from siphon.catalog import TDSCatalog latest_hrrr = TDSCatalog('http://thredds-jumbo.unidata.ucar.edu/thredds/catalog/grib/HRRR/CONUS_3km/surface/latest.xml') hrrr_ds = list(latest_hrrr.datasets.values())[0] # Set up access via NCSS from siphon.ncss import NCSS ncss = NCSS(hrrr_ds.access_urls['NetcdfSubset']) # Create a query to ask for all times in netcdf4 format for # the Temperature_surface variable, with a bounding box query = ncss.query() # <codecell> dap_url = hrrr_ds.access_urls['OPENDAP'] # <codecell> query.all_times().accept('netcdf4').variables('u-component_of_wind_height_above_ground', 'v-component_of_wind_height_above_ground') query.lonlat_box(45, 41., -63, -71.5)