four-eyes
four-eyes

Reputation: 12394

Read value over time at certain coordinate from netCDF with python

I have a netCDF file with a grid (each step 0.25°). What I want is the value of the variable, lets say tempMax, at a certain gridpoint, over the last 50 years.

I am aware that you read the data into python like this

lon = numpy.array(file.variables['longitude'][:])
lat = numpy.array(file.variables['latitude'][:])
temp = numpy.array(file.variables['tempMax'][:])
time = numpy.array(file.variables['time'][:])

That leaves me with an array and I do not know how to "untangle" it. How to get the value at a certain coordinate (stored in temp) over the whole time (stored in time)? S display is the value over the time at the certain coordinate.

Any ideas how I could achieve that?

Thanks!

Upvotes: 3

Views: 2718

Answers (1)

N1B4
N1B4

Reputation: 3453

I'm guessing that tempMax is 3D (time x lat x lon) and should then be read in as

temp = ncfile.variables['tempMAx'][:,:,:]

(Note two things: (1) if you're using Python v2, it's best to avoid the word file and instead use something like ncfile as shown above, (2) temp will be automatically stored as a numpy.ndarray simply with the call above, you don't need to use the numpy.array() command during the read in of variables.)

Now you can extract temperatures for all times at a certain location with

temp_crd = temp[:,lat_idx,lon_idx] 

where lat_idx and lon_idx are integers corresponding to the index of the latitude and longitude coordinates. If you know these indices beforehand, great, just plug them in, e.g. temp_crd = temp[:,25,30]. (You can use the tool ncdump to view the contents of a netCDF file, https://www.unidata.ucar.edu/software/netcdf/docs/netcdf/ncdump.html)

The more likely case is that you know the coordinates, but not their indices beforehand. Let's say you want temperatures at 50N and 270E. You can use the numpy.where function to extract the indices of the coordinates given the lat and lon arrays that you've already read in.

lat_idx = numpy.where(lat==50)[0][0]
lon_idx = numpy.where(lon==270)[0][0]

tmp_crd = temp[:,lat_idx,lon_idx]

Upvotes: 6

Related Questions