Source code for pyart.io.arm_sonde
"""
Utilities for ARM sonde NetCDF files.
"""
import netCDF4
import numpy as np
from ..core import HorizontalWindProfile
[docs]def read_arm_sonde(filename):
"""
Read a ARM sonde file returning a wind profile.
Parameters
----------
filename : str
Name of ARM sonde NetCDF file to read data from.
Return
------
launch_datetime : datetime
Date and time corresponding to radiosonde launch time, i.e., first
recorded time.
profile : HorizontalWindProfile
Profile of the horizontal winds
"""
dset = netCDF4.Dataset(filename, "r")
launch_datetime = netCDF4.num2date(
dset.variables["time"][0], dset.variables["time"].units
)
height = dset.variables["alt"][:] # meters above mean sea level
speed = dset.variables["wspd"][:] # m s-1
direction = dset.variables["deg"][:] # degrees clockwise from north
lat = dset.variables["lat"][:] # degrees north
lon = dset.variables["lon"][:] # degrees east
profile = HorizontalWindProfile(
height, speed, direction, latitude=lat, longitude=lon
)
dset.close()
return launch_datetime, profile
[docs]def read_arm_sonde_vap(filename, radar=None, target_datetime=None):
"""
Read a ARM interpolated or merged sonde returning a wind profile.
Parameters
----------
filename : str
Name of ARM interpolate or merged sonde NetCDF file to read data from.
radar : Radar, optional
If provided the profile returned is that which is closest in time to
the first ray collected in this radar. Either radar or target_datetime
must be provided.
target_datetime : datetime, optional
If specified the profile returned is that which is closest in time to
this datetime.
Return
------
profile_datetime : datetime
Date and time of the profile.
profile : HorizontalWindProfile
Profile of the horizontal winds.
"""
# check parameters
if radar is None and target_datetime is None:
raise ValueError("Either radar or target_datetime must be specified.")
if radar is not None and target_datetime is not None:
raise ValueError("Either radar or target_datetime must be specified, not both.")
if radar is not None:
time_0 = radar.time["data"][0]
time_units = radar.time["units"]
target_datetime = netCDF4.num2date(time_0, time_units)
dset = netCDF4.Dataset(filename, "r")
# find index of time closest to target datetime
sonde_datetimes = netCDF4.num2date(
dset.variables["time"][:], dset.variables["time"].units
)
idx = np.abs(sonde_datetimes - target_datetime).argmin()
profile_datetime = sonde_datetimes[idx]
# extract wind profile
height = dset.variables["height"][:] * 1000 # km -> m
speed = dset.variables["wspd"][idx, :]
direction = dset.variables["wdir"][idx, :]
profile = HorizontalWindProfile(height, speed, direction)
dset.close()
return profile_datetime, profile