Source code for bluemath_tk.teslakit.io.cfs

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# common
import os
import os.path as op

# pip
import xarray as xr
import numpy as np
import netCDF4 as nc4


[docs] def ReadSLP(p_db, lat1, lat2, lon1, lon2, resample, p_save = None): 'Read data from CFS SLP database: netCDF files' # TODO: poder parar y retomar la extraccion print('Reading SLP data from files...') ncfiles_1 = sorted( [op.join(p_db,f) for f in os.listdir(p_db) \ if f.endswith('.nc') and 'gdas' in f] ) ncfiles_2 = sorted( [op.join(p_db,f) for f in os.listdir(p_db) \ if f.endswith('.nc') and 'cdas1' in f] ) ncfiles = ncfiles_1 + ncfiles_2 if not ncfiles: print('No files for extraction') return None # get time array time = [] for f in ncfiles: with nc4.Dataset(f,'r') as ds: time_var = ds.variables['time'] dtime = nc4.num2date(time_var[:],time_var.units) time += list(dtime) # get longitude and latitude indexes with nc4.Dataset(ncfiles[0],'r') as ds: lon = ds.variables['lon'][:] lat = ds.variables['lat'][:] ix_lon1 = np.where(lon==lon1)[0][0] ix_lon2 = np.where(lon==lon2)[0][0] ix_lat1 = np.where(lat==lat1)[0][0] ix_lat2 = np.where(lat==lat2)[0][0] longitude = lon[ix_lon1:ix_lon2+resample:resample] latitude = lat[ix_lat1:ix_lat2+resample:resample] # read slp file by file np_SLP = np.nan * np.ones((len(time), len(latitude), len(longitude))) ti = 0 for f in ncfiles: print(f) with nc4.Dataset(f,'r') as ds: time_len = len(ds.variables['time']) slp = ds.variables['PRMSL_L101'][:] np_SLP[ti:ti+time_len,:,:] = slp[ :, ix_lat1:ix_lat2+resample:resample, ix_lon1:ix_lon2+resample:resample ] ti += time_len # mount output dataset xds_SLP = xr.Dataset( { 'SLP': (('time','latitude','longitude'), np_SLP), }, coords = { 'time': time, 'longitude': longitude, 'latitude': latitude, }, ) # save if p_save: xds_SLP.to_netcdf(p_save) return xds_SLP