SounderPy
SounderPy is an open source python package developed by University of North Dakota grad student, Kyle Gillett.¶
Relevant links:¶
Publication: Gillett (2025)
Web interface: https://
sounderpysoundings .anvil .app/ Documentation: https://
kylejgillett .github .io /sounderpy/
from datetime import datetime,timedelta
import sounderpy as spy
## ---------------------------------- SOUNDERPY ----------------------------------- ##
## Vertical Profile Data Retrieval and Analysis Tool For Python ##
## v3.0.9 | August 2025 | (C) Kyle J Gillett ##
## Docs: https://kylejgillett.github.io/sounderpy/ ##
## --------------------- THANK YOU FOR USING THIS PACKAGE! ------------------------ ##
SounderPy allows us to plot:¶
Observed (RAOB) data:
https://kylejgillett .github .io /sounderpy /gettingdata .html #observed -data -raob -igrav2 Reanalysis data from ERA5, RAP, and NCEP-NCAR reanalyses:
https://kylejgillett .github .io /sounderpy /gettingdata .html #model -reanalysis -data -rap -era5 -ncep Model data from BUFKIT sounding files (HRRR, RAP, NAM, NAM Nest (3-km NAM), GFS, and more):
https://kylejgillett .github .io /sounderpy /gettingdata .html #model -forecast -data -bufkit
We will plot reanalysis data in a later notebook. First, let’s pick our station and date/time:¶
#First, decide whether you are plotting an observed sounding, or a model sounding:
observed = True
#observed = False
#Choose station:
#Note: For data query, use either use 5-digit identifier (e.g., 72518 for ALB) or station name:
station = 'KALB'
#For observed data, station name can't include the K for U.S. stations, so we handle this by removing the K:
if (observed) and len(station) == 4 and station.startswith('K'):
station = station[1:]
#Note! For model data, must be available from the Penn State BUFKIT site: https://www.meteo.psu.edu/bufkit/
year = 2026
month = '04' #Month, day, and hour must be "zero-padded" for model data queries, so we'll set them as strings here.
day = '01'
hour = '00'
fcsthour = '00' #for model data
#In order to make datetime objects for naming our final sounding image, we need to convert the strings above to integers:
month_int = int(month)
day_int = int(day)
hour_int = int(hour)
fcsthour_int = int(fcsthour)
validTime = datetime(year, month_int, day_int, hour_int)
if (observed):
timeStr = validTime.strftime("%y%m%d%H")
print(timeStr)
print(validTime)
print(station)
else:
timeStr_temp = validTime.strftime("%y%m%d%H")
timeStr = f'{timeStr_temp}F{fcsthour}'
print(timeStr)
print(validTime)
print(station)26040100
2026-04-01 00:00:00
ALB
The cell below allows for plotting either 1) observed data; or 2) model data.¶
#For observed data:
#argument list: spy.get_obs_data(station, year, month, day, hour)
if (observed):
data = spy.get_obs_data(station,year,month,day,hour)
#For BUFKIT model data (can be hrrr, rap, nam, namnest, gfs, sref, hiresw)
#argument list: spy.get_bufkit_data(model, station, fcst_hour, run_year=None, run_month=None, run_day=None, run_hour=None)
else:
data = spy.get_bufkit_data('hrrr', station, fcsthour_int, year, month, day, hour)> OBSERVED DATA ACCESS FUNCTION
-----------------------------------
> PROFILE FOUND: ALB on 04/01/2026 at 00z | From UW
> COMPLETE --------
> RUNTIME: 00:00:00
> SUMMARY: 00Z Launch for KALB, ALBANY at 04-01-2026-00Z
> THERMODYNAMICS ---------------------------------------------
--- SBCAPE: 349.2 | MUCAPE: 349.2 | MLCAPE: 42.0 | MUECAPE: 333.8
--- MU 0-3: 76.0 | MU 0-6: 246.8 | SB 0-3: 76.0 | SB 0-6: 246.8
> KINEMATICS -------------------------------------------------
--- 0-500 SRW: 30.7 knot | 0-500 SWV: 0.018 | 0-500 SHEAR: 17.2 | 0-500 SRH: 123.1
--- 1-3km SRW: 22.9 knot | 1-3km SWV: 0.009 | 1-3km SHEAR: 33.6 | | 1-3km SRH: 111.8
==============================================================
#Investigate data:
data{'p': <Quantity([997. 991. 985. 977. 975. 963. 959. 942. 925. 924. 909. 892. 882. 853.
850. 845. 838. 822. 813. 805. 798. 796. 787. 776. 773. 763. 757. 752.
739. 735. 733. 730. 728. 725. 711. 707. 704. 700. 699. 698. 697. 695.
691. 690. 678. 672. 667. 658. 656. 652. 650. 641. 636. 634. 631. 626.
617. 616. 606. 595. 593. 592. 588. 586. 577. 556. 551. 542. 535. 531.
527. 521. 512. 505. 500. 499. 492. 489. 471. 464. 455. 448. 439. 430.
423. 420. 413. 400. 390. 384. 376. 375. 371. 363. 361. 356. 351. 350.
347. 343. 340. 337. 333. 326. 324. 319. 313. 311. 305. 303. 301. 300.
297. 293. 289. 288. 285. 284. 279. 267. 265. 262. 257. 250. 247. 245.
237. 236. 230. 225. 217. 214. 208. 205. 204. 201. 200. 199. 196. 193.
189. 185. 179. 178. 175. 168. 167. 166. 165. 160. 158. 155. 150. 147.
143. 142. 139. 135. 131. 129. 127. 124. 120. 119. 118. 116. 113. 112.
109. 108. 102. 100.], 'hectopascal')>,
'z': <Quantity([ 95 148 202 274 292 401 438 595 754 763 901 1061
1156 1438 1468 1517 1586 1746 1837 1919 1991 2012 2105 2221
2252 2358 2423 2477 2619 2663 2685 2718 2740 2774 2931 2977
3011 3057 3068 3080 3091 3115 3161 3173 3312 3383 3443 3551
3576 3624 3648 3759 3821 3846 3883 3946 4060 4072 4200 4344
4370 4383 4436 4463 4583 4870 4940 5066 5166 5223 5281 5368
5500 5605 5680 5695 5802 5849 6131 6243 6390 6507 6657 6810
6931 6983 7106 7340 7522 7633 7784 7803 7879 8033 8072 8170
8269 8289 8350 8431 8492 8553 8636 8783 8825 8932 9062 9106
9238 9283 9328 9350 9418 9509 9601 9624 9694 9717 9835 10124
10173 10248 10372 10550 10626 10678 10888 10914 11076 11210 11432 11518
11692 11781 11811 11900 11930 11960 12051 12143 12267 12394 12588 12622
12724 12969 13005 13042 13079 13266 13343 13460 13660 13782 13949 13992
14122 14301 14484 14578 14673 14821 15023 15075 15127 15233 15394 15449
15617 15674 16028 16150], 'meter')>,
'T': <Quantity([ 21.4 20.8 20.2 21. 20.9 20.2 20. 18.6 17.2 17.1 15.9 14.4
13.6 11.1 10.8 10.4 9.9 8.7 8. 7.3 6.8 6.7 6.2 5.6
5.4 4.7 4.3 4. 3.1 2.8 2.4 2.4 2.5 2.6 1.8 1.6
1.3 1. 1. 1. 0.9 0.8 1. 0.8 -0.3 -0.8 -1.3 -2.1
-2.3 -2.6 -2.7 -3.1 -3.4 -3.5 -3.8 -4.3 -5. -5.1 -5.6 -6.1
-6.4 -6.5 -6.8 -6.9 -7.7 -9.6 -10.1 -10.9 -11.5 -11.9 -12.4 -13.1
-13.9 -14.5 -14.9 -15. -15.6 -15.9 -17.8 -18.5 -19.5 -20.3 -21.4 -22.4
-23.3 -23.7 -24.7 -26.5 -27.9 -28.7 -29.9 -30.1 -30.7 -32.1 -32.4 -33.2
-33.9 -34.1 -34.4 -34.9 -35.3 -35.9 -36.6 -37.8 -38.1 -38.8 -39.7 -40.2
-41.6 -42.1 -42.4 -42.5 -43.2 -44.1 -44.9 -45.1 -45.9 -46.1 -47.3 -49.9
-50.4 -51.1 -52.5 -54.7 -55.3 -55.8 -57.5 -57.8 -59.3 -60.6 -62.8 -63.6
-65.3 -66.2 -66.5 -67.4 -67.7 -67.9 -68.6 -69.3 -70.3 -71.1 -72.3 -71.5
-69.1 -63.3 -62.9 -63.1 -63.2 -64.1 -64.5 -65. -65.9 -66. -66.2 -66.3
-65.6 -64.7 -63.7 -63.2 -62.7 -62.3 -62. -62. -61.9 -62.1 -62.5 -62.2
-61.3 -61.4 -62.1 -61.5], 'degree_Celsius')>,
'Td': <Quantity([ 14.4 12.8 12.2 12. 11.9 11.2 11. 10.1 9.2 9.2 8.8 8.3
8.1 7.3 7.2 7. 6.8 6.3 6. 5.7 5.5 5.3 4.6 3.7
3.4 2.9 2.6 2.4 1.7 1.5 0.9 0.3 0.2 0. -1.2 -1.6
-1.6 -1.6 -1.7 -1.7 -1.9 -2.3 -2.4 -2.6 -2.9 -3. -3.1 -3.4
-3.4 -3.8 -4. -4.3 -4.4 -4.5 -4.9 -5.6 -6. -6. -7.2 -8.5
-8.6 -8.7 -9.1 -9.3 -9.9 -11.5 -11.9 -12.7 -13.3 -13.7 -14.1 -14.7
-15.7 -16.4 -17. -17.1 -17.8 -18.1 -20.1 -20.9 -21.9 -22.7 -23.8 -25.
-25.9 -26.3 -27.3 -29.1 -30.6 -31.5 -32.8 -33. -33.6 -34.9 -35.2 -36.1
-37. -37.2 -37.2 -37.3 -38.2 -38.2 -39. -40.6 -41. -41.5 -42. -42.6
-44.5 -45.1 -45.3 -45.4 -46. -46.9 -48.1 -48.3 -48.9 -49.1 -50.4 -53.1
-53.5 -54.2 -56.5 -57.9 -58.6 -59.1 -61.1 -61.3 -62.6 -63.9 -66. -66.8
-68.5 -69.3 -69.6 -70.4 -70.7 -71. -71.7 -72.5 -73.5 -74.1 -75.8 -75.2
-73.5 -69.3 -68.9 -69.2 -69.5 -70.9 -71.5 -72.4 -73.9 -74.4 -75.1 -75.3
-75.4 -75.5 -75.6 -75.6 -75.7 -75.3 -75.7 -75.8 -75.9 -76.5 -77.5 -77.5
-77.3 -77.7 -80.1 -80.5], 'degree_Celsius')>,
'u': <Quantity([ 0.98480775 3.65418183 6.38908408 6.88291724 6.5 8.35623893
9.18482641 12.72792206 15.56388884 16.38304089 16.38304089 15.58845727
15.58845727 21.61293028 22.65769468 21.65063509 19.05255888 21.29795315
25.37661804 27.71281292 25.98076211 25.11473671 26.21286542 33.53338812
33.53338812 35.34600369 31.00985649 31.00985649 30.90962644 31.87555227
32.84147809 31.87555227 30.90962644 33.80740392 45.39851384 49.26221714
52.15999462 51.19406879 49.72784731 49.45493885 47.92432366 48.86401628
49.8037089 50.74340152 54.50217201 50.74340152 51.68309414 48.86401628
49.8037089 52.62278676 51.68309414 49.8037089 51.68309414 49.14074429
46.22169714 47.12800493 49.84692829 49.84692829 48.9406205 44.94632353
44.43258801 44.21803801 41.34647531 41.60281733 43.46666218 43.22586056
44.69965627 47.33036549 44.31634889 46.54259923 47.81734551 45.65712298
41.36192563 44.31634889 48.2555799 48.81354021 46.82115081 46.82115081
43.83256672 43.83256672 38.85159323 39.50753362 40.5688847 39.60295888
40.5688847 41.53481053 46.36443966 39.60295888 36.64801221 36.64801221
39.41172953 39.60295888 40.40678269 43.25677632 44.43258801 43.33154113
45.39851384 45.39851384 43.46666218 46.6017693 48.86401628 50.22814297
50.75323607 50.74340152 52.62278676 52.15999462 54.09184627 55.0577721
57.95554958 56.98962375 55.0577721 54.09184627 57.95554958 54.56472363
51.04461354 50.2251954 51.21000316 52.19481091 48.2555799 55.92325395
56.78309779 60.54531525 65.98211945 72.72221296 73.71840766 71.72601826
73.71840766 73.71840766 75.26037322 76.81500473 71.47851115 73.86058148
69.54665949 72.44443697 72.44443697 71.47851115 71.47851115 72.44443697
73.4103628 73.4103628 75.93967398 77.03557782 79.87387277 80.81356539
77.0547949 59.77168189 56.96527714 54. 58.10365743 55.78690309
51.21000316 56.02369792 59.08846518 61.76407128 61.76407128 60.66583562
57.11884967 59.08846518 53.12592045 53.12592045 48.71850324 41.36192563
43.33154113 40.37711787 42.34673338 46.28596439 44.82876141 46.82115081
56.99131862 60. 57.11884967 55.14923417], 'knot')>,
'v': <Quantity([ 1.73648178e-01 1.62694657e+00 4.81452019e+00 9.82982453e+00
1.12583302e+01 9.95857776e+00 1.05659341e+01 1.27279221e+01
1.08979523e+01 1.14715287e+01 1.14715287e+01 9.00000000e+00
9.00000000e+00 7.86646330e+00 1.05654565e+01 1.25000000e+01
1.10000000e+01 1.49129873e+01 1.18333113e+01 1.60000000e+01
1.50000000e+01 1.45000000e+01 1.83544460e+01 1.56368757e+01
1.56368757e+01 1.64821122e+01 1.12866647e+01 1.12866647e+01
8.28220944e+00 8.54102849e+00 8.79984753e+00 8.54102849e+00
8.28220944e+00 9.05866658e+00 1.21644951e+01 1.31997713e+01
1.39762284e+01 1.37174094e+01 1.52033286e+01 1.60688837e+01
1.74430273e+01 1.77850475e+01 1.81270676e+01 1.84690877e+01
1.98371683e+01 1.84690877e+01 1.88111079e+01 1.77850475e+01
1.81270676e+01 1.91531280e+01 1.88111079e+01 1.81270676e+01
1.88111079e+01 1.98541495e+01 2.15535313e+01 2.19761496e+01
2.32440044e+01 2.32440044e+01 2.28213861e+01 1.37414701e+01
1.19056761e+01 1.26793184e+01 1.50488863e+01 1.43249988e+01
1.16468570e+01 1.57329266e+01 1.45237987e+01 1.26821332e+01
7.81416800e+00 6.54113575e+00 4.18347565e+00 5.60598980e+00
7.29322346e+00 7.81416800e+00 8.50876071e+00 4.27063139e+00
4.09631991e+00 4.09631991e+00 3.83485268e+00 3.83485268e+00
3.39907397e+00 6.25737860e+00 1.08703999e+01 1.06115808e+01
1.08703999e+01 1.11292189e+01 1.24233142e+01 1.06115808e+01
1.33387856e+01 1.33387856e+01 1.13011316e+01 1.06115808e+01
1.47068662e+01 1.24036810e+01 1.19056761e+01 7.64051982e+00
1.21644951e+01 1.21644951e+01 1.16468570e+01 1.51418327e+01
1.77850475e+01 1.34585903e+01 2.36666227e+01 1.84690877e+01
1.91531280e+01 1.39762284e+01 1.44938665e+01 1.47526856e+01
1.55291427e+01 1.52703237e+01 1.47526856e+01 1.44938665e+01
1.55291427e+01 1.25972590e+01 9.92206776e+00 8.85605706e+00
9.02970524e+00 9.20335342e+00 8.50876071e+00 -2.93081355e+00
-4.96787734e+00 -7.43402995e+00 -1.16344279e+01 -6.36236922e+00
-6.44952496e+00 -6.27521348e+00 -6.44952496e+00 -6.44952496e+00
-1.05771557e+01 -1.35445579e+01 -1.91526093e+01 -1.30236133e+01
-1.86349712e+01 -1.94114284e+01 -1.94114284e+01 -1.91526093e+01
-1.91526093e+01 -1.94114284e+01 -1.96702474e+01 -1.96702474e+01
-2.17753511e+01 -2.50303765e+01 -2.90717122e+01 -2.94137323e+01
-2.80456518e+01 -5.22934456e+00 -1.98927131e+00 9.91963907e-15
1.02452425e+01 4.88072159e+00 9.02970524e+00 1.50115046e+01
1.04188907e+01 5.40365605e+00 -5.40365605e+00 -6.37623626e+00
-1.00715943e+01 -1.04188907e+01 -1.42350475e+01 -1.42350475e+01
-1.12475527e+01 -7.29322346e+00 -7.64051982e+00 -7.11957528e+00
-7.46687164e+00 -8.16146435e+00 -3.92200842e+00 -4.09631991e+00
-9.94787167e-01 1.10218212e-14 -1.00715943e+01 -9.72429795e+00], 'knot')>,
'site_info': {'site-id': 'KALB',
'site-name': 'ALBANY',
'site-lctn': 'NY US',
'site-latlon': [42.75, -73.8],
'site-elv': np.float64(89.0),
'source': 'RAOB OBSERVED PROFILE',
'model': 'no-model',
'fcst-hour': 'no-fcst-hour',
'run-time': ['none', 'none', 'none', 'none'],
'valid-time': [2026, '04', '01', '00']},
'titles': {'top_title': 'RAOB OBSERVED VERTICAL PROFILE',
'left_title': 'VALID: 04-01-2026 00Z',
'right_title': 'KALB - ALBANY, NY US | 42.75, -73.8 '}}Finally, create your sounding! A .png image will be saved using the time string and station name we set earlier.¶
spy.build_sounding(data,save=True,filename=(f'{timeStr}_{station}.png'))> SOUNDING PLOTTER FUNCTION
---------------------------------
Ignoring fixed x limits to fulfill fixed data aspect with adjustable data limits.
Ignoring fixed y limits to fulfill fixed data aspect with adjustable data limits.
Ignoring fixed x limits to fulfill fixed data aspect with adjustable data limits.
> COMPLETE --------
> RUNTIME: 00:00:19

- Gillett, K. J. (2025). SounderPy: An atmospheric sounding visualization and analysis tool for Python. Journal of Open Source Software, 10(112), 8087. 10.21105/joss.08087