Source code for toto.inputs.moet

"""Read MOET netcdf file
    This import function works with NetCDF files created by MetOcean Solution Ltd.
    This NetCDF file have a special format to be read by the MOET software. 
    This class returns a Panda Dataframe with some extra attributes such as 
    Latitude,Longitude,Units.
    
    Parameters
    ~~~~~~~~~~

    filename : (files,) str or list_like
        A list of filename to process.

    Examples
    ~~~~~~~~

    >>> from toto.inputs.moet import MOETfile
    >>> nc=MOETfile('filename.nc')._toDataFrame()

"""
import glob,os,sys
import pandas as pd
import xarray as xr
import numpy as np


[docs]def read_quality(inqual,quality_group): if ~isinstance(inqual,int): Q1=np.int32(inqual); else: Q1=inqual if quality_group>15: quality_group=quality_group-16 qual=np.int32(np.zeros((len(Q1),1))) shift=2**(2*quality_group) hibit=np.zeros((len(Q1),1)) hibit[Q1<0]=1 Q1[Q1<0]=Q1[Q1<0]+2**31 qual=np.mod(np.floor(np.double(Q1)/np.double(shift)),4) if quality_group==15: qual[hibit==1]=qual[hibit==1]+2 # for s in range(0,len(Q1)): # hibit=0 # if (Q1[s]<0): # Q1[s]=Q1[s]+2**31 # hibit=1 # qual[s]=np.mod(np.floor(np.double(Q1[s])/np.double(shift)),4) # if np.logical_and(quality_group==15,hibit==1): # qual[s]=qual[s]+2 return np.double(qual)
[docs]class MOETfile():
[docs] @staticmethod def defaultExtensions(): return ['.nc']
def __init__(self,filenames): if isinstance(filenames,str): filenames=[filenames] self.filenames=filenames self.data=[] # READ self._reads_nc() def _reads_nc(self): for file in self.filenames: self._read_nc(file) def _read_nc(self,filename): ds = xr.open_dataset(filename) D1_keys=[] D2_keys=[] key_to_drop=[] for key in ds.keys(): if 'records' in ds[key].dims: # if 'lev' in ds[key].dims: # D2_keys.append(key) # else: D1_keys.append(key) else: key_to_drop.append(key) ds.drop_vars(key_to_drop) df = ds.to_dataframe() df0=[] if len(D2_keys)>0: nlev=df.index.get_level_values('lev').unique() for m in nlev: df2d=df[D2_keys].loc[(m)] df2d.reset_index(inplace=True) df2d.set_index('time',inplace=True) df2d=df2d.add_suffix('_lev_'+str(m)) df0.append(df2d) if len(D1_keys)>0: df1d=df[D1_keys] t0=df1d['Time'][:,0] t1=df1d['Time'][:,1] year=np.floor(t0/10000).astype(int) month=np.floor((t0-(year*10000))/100).astype(int) day=np.floor((t0-(year*10000)-(month*100))/1).astype(int) tt=pd.to_datetime({'Year':year,'Month':month,'Day':day})+pd.to_timedelta(t1,'ms') del df1d['Time'] df1d.reset_index(inplace=True) df1d=df1d.drop_duplicates(subset='records').set_index('records') del df1d['timedim'] # df1d['time']=tt df1d.reset_index(inplace=True) df1d.set_index('time',inplace=True) del df1d['records'] df0.append(df1d) df0=pd.concat(df0,axis=1) df0.reset_index(inplace=True) df0.set_index('time',inplace=True,drop=False) columns=df0.columns for col in list(df0.columns): if '_lev_' in col: Col=col.split('_lev_')[0] elif col=='time': continue else: Col=col if hasattr(ds[Col],'quality_group'): quality_group=getattr(ds[Col],'quality_group') if quality_group<16: qual=read_quality(ds['Qual1'][:],quality_group) del df0['Qual1'] else: qual=read_quality(ds['Qual2'][:],quality_group) del df0['Qual2'] df0['mask']=qual df0=df0.mask(df0['mask']>2) del df0['mask'] if hasattr(ds[Col],'units'): setattr(df0[col],'units',ds[Col].units) if hasattr(ds[Col],'long_name'): setattr(df0[col],'long_name',ds[Col].long_name) if 'Longitude' in ds: setattr(df0,'longitude',ds['Longitude'].values) setattr(df0,'latitude',ds['Latitude'].values) self.data.append(df0) def _toDataFrame(self): #print(self.data) return self.data
if __name__ == '__main__': MOETfile('/home/remy/Downloads/dep2/77689_RAW_February_Geraldton.nc')