[1]:
!test -f temp.bufr || wget https://sites.ecmwf.int/repository/pdbufr/test-data/temp.bufr --output-document=temp.bufr
How to extract radiosonde data with the generic reader?¶
[2]:
import pdbufr
The input BUFR data contains radiosonde observations. Each message represents a given station and contains vertical profiles on a set of pressure levels.
In this notebook we read this data with the generic reader, which is the default reader.
Example 1¶
Getting the WMO station ID and location for each message. Notice that since “WMO_station_id” is a computed key it appears as the last column in the resulting dataframe.
[3]:
df = pdbufr.read_bufr("temp.bufr", columns=("WMO_station_id", "latitude", "longitude"))
df.head()
[3]:
| latitude | longitude | WMO_station_id | |
|---|---|---|---|
| 0 | 58.47 | -78.08 | 71907 |
| 1 | 53.75 | -73.67 | 71823 |
| 2 | -90.00 | 0.00 | 89009 |
| 3 | 18.43 | -69.88 | 78486 |
| 4 | 21.98 | -159.33 | 91165 |
Example 2¶
Extracting the same data but only for a given station.
[4]:
df = pdbufr.read_bufr(
"temp.bufr",
columns=("WMO_station_id", "latitude", "longitude"),
filters={"WMO_station_id": 71907},
)
df
[4]:
| latitude | longitude | WMO_station_id | |
|---|---|---|---|
| 0 | 58.47 | -78.08 | 71907 |
Example 3¶
Getting temperature profiles for two stations.
[5]:
df = pdbufr.read_bufr(
"temp.bufr",
columns=("WMO_station_id", "data_datetime", "pressure", "airTemperature"),
filters={"WMO_station_id": [71823, 71907]},
)
df.head()
[5]:
| pressure | airTemperature | data_datetime | WMO_station_id | |
|---|---|---|---|---|
| 0 | 100300.0 | 258.3 | 2008-12-08 12:00:00 | 71907 |
| 1 | 100000.0 | 259.7 | 2008-12-08 12:00:00 | 71907 |
| 2 | 99800.0 | 261.1 | 2008-12-08 12:00:00 | 71907 |
| 3 | 99100.0 | 261.7 | 2008-12-08 12:00:00 | 71907 |
| 4 | 92500.0 | 258.1 | 2008-12-08 12:00:00 | 71907 |
[6]:
df.tail()
[6]:
| pressure | airTemperature | data_datetime | WMO_station_id | |
|---|---|---|---|---|
| 44 | 30000.0 | 218.9 | 2008-12-08 12:00:00 | 71823 |
| 45 | 29700.0 | 218.9 | 2008-12-08 12:00:00 | 71823 |
| 46 | 25000.0 | 221.1 | 2008-12-08 12:00:00 | 71823 |
| 47 | 23200.0 | 223.1 | 2008-12-08 12:00:00 | 71823 |
| 48 | 20500.0 | 221.5 | 2008-12-08 12:00:00 | 71823 |
Example 4¶
Extracting temperature profiles for a given station only on standard pressure levels when temperature >= -30 C.
[7]:
df = pdbufr.read_bufr(
"temp.bufr",
columns=("WMO_station_id", "data_datetime", "pressure", "airTemperature"),
filters={"WMO_station_id": 71907, "verticalSoundingSignificance": 32, "airTemperature": slice(243.16, None)},
)
df
[7]:
| pressure | airTemperature | data_datetime | WMO_station_id | |
|---|---|---|---|---|
| 0 | 100000.0 | 259.7 | 2008-12-08 12:00:00 | 71907 |
| 1 | 92500.0 | 258.1 | 2008-12-08 12:00:00 | 71907 |
| 2 | 85000.0 | 253.1 | 2008-12-08 12:00:00 | 71907 |
Example 5¶
Extracting temperature, dewpoint and wind values on 500 hPa in the tropics:
[8]:
df = pdbufr.read_bufr(
"temp.bufr",
columns=(
"latitude",
"longitude",
"pressure",
"airTemperature",
"dewpointTemperature",
"windDirection",
"windSpeed",
),
filters={"latitude": slice(-20, 20), "pressure": 50000},
)
df
[8]:
| latitude | longitude | pressure | airTemperature | dewpointTemperature | windDirection | windSpeed | |
|---|---|---|---|---|---|---|---|
| 0 | 18.43 | -69.88 | 50000.0 | 267.5 | 247.5 | 275 | 4.0 |
| 1 | 18.03 | -63.12 | 50000.0 | 267.5 | 244.5 | 340 | 5.0 |
| 2 | 13.47 | 144.78 | 50000.0 | 270.3 | 249.3 | 110 | 12.0 |
| 3 | 7.08 | 171.38 | 50000.0 | 268.9 | 226.9 | 220 | 6.0 |
| 4 | 7.45 | 151.83 | 50000.0 | 269.9 | 249.9 | 50 | 18.0 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 69 | -10.17 | 123.67 | 50000.0 | 269.5 | 267.0 | 70 | 11.0 |
| 70 | -1.18 | 136.12 | 50000.0 | 264.1 | 262.6 | 80 | 8.0 |
| 71 | -2.17 | 106.13 | 50000.0 | 268.9 | 263.9 | 135 | 6.0 |
| 72 | 2.83 | -60.70 | 50000.0 | 267.5 | 258.5 | 90 | 8.0 |
| 73 | -3.67 | -69.67 | 50000.0 | 266.7 | 266.6 | 350 | 4.0 |
74 rows × 7 columns