I don’t know if ECMWF.opendata python code can do a dry run and show the HTTP requests.
Regardless of how ECMWF.opendata works under the hood, there are two ways to progress on this matter. I’ll explain the first way (the easiest) here, and if time permits, the second way in a subsequent post.
Firstly, if you look at the Open Data directory you’ll see each GRIB file has a corresponding index file:
Name Creation date Size Id
20250506000000-0h-oper-fc.grib2 06-05-2025 08:34 120768148 143092820
20250506000000-0h-oper-fc.index 06-05-2025 08:34 34689 143092825
20250506000000-102h-oper-fc.grib2 06-05-2025 08:34 127154353 143093911
20250506000000-102h-oper-fc.index 06-05-2025 08:34 34453 143093914
20250506000000-105h-oper-fc.grib2 06-05-2025 08:34 127594309 143093928
20250506000000-105h-oper-fc.index 06-05-2025 08:34 34454 143093931
20250506000000-108h-oper-fc.grib2 06-05-2025 08:34 127710533 143093950
These .index
files are just text files which list the individual records in the GRIB file. Here’s an example from the 20250506000000-24h-oper-fc.index
file:
/Users/tim/Downloads> head 20250506000000-24h-oper-fc.index
{"domain": "g", "date": "20250506", "time": "0000", "expver": "0001", "class": "od", "type": "fc", "stream": "oper", "step": "24", "levtype": "sfc", "param": "tcwv", "_offset": 0, "_length": 693873}
{"domain": "g", "date": "20250506", "time": "0000", "expver": "0001", "class": "od", "type": "fc", "stream": "oper", "levtype": "sfc", "step": "24", "param": "ssr", "_offset": 693873, "_length": 1308109}
{"domain": "g", "date": "20250506", "time": "0000", "expver": "0001", "class": "od", "type": "fc", "stream": "oper", "step": "24", "levelist": "3", "levtype": "sol", "param": "vsw", "_offset": 2001982, "_length": 496249}
{"domain": "g", "date": "20250506", "time": "0000", "expver": "0001", "class": "od", "type": "fc", "stream": "oper", "step": "24", "levelist": "150", "levtype": "pl", "param": "q", "_offset": 2498231, "_length": 593105}
{"domain": "g", "date": "20250506", "time": "0000", "expver": "0001", "class": "od", "type": "fc", "stream": "oper", "levtype": "sfc", "step": "24", "param": "str", "_offset": 3091336, "_length": 1315885}
{"domain": "g", "date": "20250506", "time": "0000", "expver": "0001", "class": "od", "type": "fc", "stream": "oper", "step": "24", "levelist": "1", "levtype": "sol", "param": "sot", "_offset": 4407221, "_length": 628449}
{"domain": "g", "date": "20250506", "time": "0000", "expver": "0001", "class": "od", "type": "fc", "stream": "oper", "step": "24", "levelist": "4", "levtype": "sol", "param": "vsw", "_offset": 5035670, "_length": 425364}
{"domain": "g", "date": "20250506", "time": "0000", "expver": "0001", "class": "od", "type": "fc", "stream": "oper", "levtype": "sfc", "step": "24", "param": "ttr", "_offset": 5461034, "_length": 1233636}
{"domain": "g", "date": "20250506", "time": "0000", "expver": "0001", "class": "od", "type": "fc", "stream": "oper", "levtype": "sfc", "step": "24", "param": "10fg", "_offset": 6694670, "_length": 1414980}
{"domain": "g", "date": "20250506", "time": "0000", "expver": "0001", "class": "od", "type": "fc", "stream": "oper", "levtype": "sfc", "step": "24", "param": "ewss", "_offset": 8109650, "_length": 356723}
In particular, the _offset
and _length
fields tell the reading software where in the file this particular record begins, and how long it is. For example, parameter 10fg
(wind gust speed at 10 m above the surface) starts at offset 6,694,670 bytes, and the record is 1,414,980 bytes long.
With this information, one can slice particular fields out of the big files, and save on downloads too.