I’m using the following api call to download ERA5 data:
import cdsapi
dataset = "reanalysis-era5-single-levels"
request = {
"product_type": ["reanalysis"],
"variable": ["2m_temperature"],
"year": ["2025"],
"month": ["06"],
"day": [
"01", "02", "03",
"04", "05", "06",
"07", "08", "09",
"10", "11", "12",
"13", "14", "15",
"16", "17", "18",
"19", "20", "21",
"22", "23", "24",
"25", "26", "27",
"28", "29", "30"
],
"time": [
"00:00", "01:00", "02:00",
"03:00", "04:00", "05:00",
"06:00", "07:00", "08:00",
"09:00", "10:00", "11:00",
"12:00", "13:00", "14:00",
"15:00", "16:00", "17:00",
"18:00", "19:00", "20:00",
"21:00", "22:00", "23:00"
],
"data_format": "netcdf",
"download_format": "unarchived",
"area": [70.1641930203, 20.6455928891, 59.846373196, 31.5160921567]
}
client = cdsapi.Client()
client.retrieve(dataset, request).download()
Note in particular the coordinates for the bounding box for Finland (“area”: [65.170833, 19.9375, 55.170833, 29.9375]). If I submit this request, the coordinates in the downloaded netcdf file are (ncdump -v longitude/latitude)
longitude = 20.645, 20.895023255814, 21.1450465116279, 21.3950697674419,
21.6450930232558, 21.8951162790698, 22.1451395348837, 22.3951627906977,
22.6451860465116, 22.8952093023256, 23.1452325581395, 23.3952558139535,
23.6452790697674, 23.8953023255814, 24.1453255813954, 24.3953488372093,
24.6453720930233, 24.8953953488372, 25.1454186046512, 25.3954418604651,
25.6454651162791, 25.895488372093, 26.145511627907, 26.3955348837209,
26.6455581395349, 26.8955813953488, 27.1456046511628, 27.3956279069767,
27.6456511627907, 27.8956744186047, 28.1456976744186, 28.3957209302326,
28.6457441860465, 28.8957674418605, 29.1457906976744, 29.3958139534884,
29.6458372093023, 29.8958604651163, 30.1458837209302, 30.3959069767442,
30.6459302325581, 30.8959534883721, 31.1459767441861, 31.396 ;
latitude = 70.097, 69.847, 69.597, 69.347, 69.097, 68.847, 68.597, 68.347,
68.097, 67.847, 67.597, 67.347, 67.097, 66.847, 66.597, 66.347, 66.097,
65.847, 65.597, 65.347, 65.097, 64.847, 64.597, 64.347, 64.097, 63.847,
63.597, 63.347, 63.097, 62.847, 62.597, 62.347, 62.097, 61.847, 61.597,
61.347, 61.097, 60.847, 60.597, 60.347, 60.097, 59.846 ;
This is quite unexpected and messes up my further evaluation, as I’m trying to pick data from one grid cell containing a certain location.
If I, however, change the requested bounding box to rounded values (i.e., “area”: [71, 20, 59, 32]), the lon/lat values are what I would expect, i.e.
longitude = 20, 20.25, 20.5, 20.75, 21, 21.25, 21.5, 21.75, 22, 22.25, 22.5,
22.75, 23, 23.25, 23.5, 23.75, 24, 24.25, 24.5, 24.75, 25, 25.25, 25.5,
25.75, 26, 26.25, 26.5, 26.75, 27, 27.25, 27.5, 27.75, 28, 28.25, 28.5,
28.75, 29, 29.25, 29.5, 29.75, 30, 30.25, 30.5, 30.75, 31, 31.25, 31.5,
31.75, 32 ;
latitude = 71, 70.75, 70.5, 70.25, 70, 69.75, 69.5, 69.25, 69, 68.75, 68.5,
68.25, 68, 67.75, 67.5, 67.25, 67, 66.75, 66.5, 66.25, 66, 65.75, 65.5,
65.25, 65, 64.75, 64.5, 64.25, 64, 63.75, 63.5, 63.25, 63, 62.75, 62.5,
62.25, 62, 61.75, 61.5, 61.25, 61, 60.75, 60.5, 60.25, 60, 59.75, 59.5,
59.25, 59 ;
The actual data appear to be the same in both cases, but I haven’t done any deeper analysis on this yet.
Is this the expected behaviour? What is happening under the hood and how can I make sure that the data I download correspond to the original grid points of the reanalysis?