Source code for toto.inputs.msl
"""Read MSL netcdf file
This import function works with NetCDF files created by MetOcean Solution Ltd.
This NetCDF file have been extracted by the UDS.
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.msl import MSLfile
>>> nc=MSLfile('filename.nc')._toDataFrame()
"""
import glob,os,sys
import pandas as pd
import xarray as xr
[docs]class MSLfile():
[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):
try:
ds = xr.open_dataset(filename)
except:
ds = xr.open_dataset(filename, decode_times=False)
ds = xr.decode_cf(ds, use_cftime=True)
D2_keys=[]
D3_keys=[]
key_to_drop=[]
for key in ds.keys():
if 'time' in ds[key].dims:
if 'lev' in ds[key].dims:
D3_keys.append(key)
else:
D2_keys.append(key)
else:
key_to_drop.append(key)
ds.drop_vars(key_to_drop)
df = ds.to_dataframe()
sites=df.index.get_level_values('site').unique()
for n in sites:
df0=[]
if len(D3_keys)>0:
nlev=df.index.get_level_values('lev').unique()
for m in nlev:
df3d=df[D3_keys].loc[(0,m,n)]
df3d.reset_index(inplace=True)
df3d.set_index('time',inplace=True)
df3d=df3d.add_suffix('_lev_'+str(m))
df0.append(df3d)
if len(D2_keys)>0:
#import pdb;pdb.set_trace()
df2d=df[D2_keys].loc[(0,n)]
df2d.reset_index(inplace=True)
df2d.set_index('time',inplace=True)
df0.append(df2d)
df0=pd.concat(df0,axis=1)
df0.reset_index(inplace=True)
df0.set_index('time',inplace=True,drop=False)
for col in list(df0.columns):
if '_lev_' in col:
Col=col.split('_lev_')[0]
else:
Col=col
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 'lon' in ds:
setattr(df0,'longitude',ds['lon'][n].values)
setattr(df0,'latitude',ds['lat'][n].values)
self.data.append(df0)
def _toDataFrame(self):
#print(self.data)
return self.data