Read realtime data from NERACOOS ERDDAP

Exploring use of Python to formulate NERACOOS ERDDAP data requests and process the responses.

Initialize


In [1]:
%matplotlib inline
import pandas as pd
import numpy as np
import seawater as sw
import matplotlib.pyplot as plt

In [2]:
# Use ERDDAP's built-in relative time functionality to get last 48 hours:
#start='now-7days'
#stop='now'
# or specify a specific period:
start = '2016-09-06T00:00:00Z'
stop =  '2016-11-07T00:00:00Z'

Obtain data from ERDDAP


In [3]:
# read instrument data (E01_sbe16)
url='http://www.neracoos.org/erddap/tabledap/E01_sbe16_trans_all.csv?\
station,time,depth,longitude,latitude,attenuation,sigma_t,temperature,salinity\
&time>={}&time<={}'.format(start,stop)

print(url)
df_sb = pd.read_csv(url,index_col='time',parse_dates=True,skiprows=[1])  # skip the units row


http://www.neracoos.org/erddap/tabledap/E01_sbe16_trans_all.csv?station,time,depth,longitude,latitude,attenuation,sigma_t,temperature,salinity&time>=2016-09-06T00:00:00Z&time<=2016-11-07T00:00:00Z
new_index = pd.date_range(start=df.index[0],end=df.index[-1],freq='15min') df.reindex(new_index).interpolate(limit=10)

In [4]:
# read met data (E01_met)
url='http://www.neracoos.org/erddap/tabledap/E01_met_all.csv?\
station,time,air_temperature,barometric_pressure,wind_gust,wind_speed,\
wind_direction,visibility\
&time>={}&time<={}'.format(start,stop)
print(url)

df_met = pd.read_csv(url,index_col='time',parse_dates=True,skiprows=[1])  # skip the units row


http://www.neracoos.org/erddap/tabledap/E01_met_all.csv?station,time,air_temperature,barometric_pressure,wind_gust,wind_speed,wind_direction,visibility&time>=2016-09-06T00:00:00Z&time<=2016-11-07T00:00:00Z

In [5]:
# read wave data (E01_accelerometer)
url='http://www.neracoos.org/erddap/tabledap/E01_accelerometer_all.csv?\
station,time,mooring_site_desc,significant_wave_height,dominant_wave_period&\
time>={}&time<={}'.format(start,stop)
print(url)
# Load the CSV data directly into Pandas
df_wave = pd.read_csv(url,index_col='time',parse_dates=True,skiprows=[1])  # skip the units row


http://www.neracoos.org/erddap/tabledap/E01_accelerometer_all.csv?station,time,mooring_site_desc,significant_wave_height,dominant_wave_period&time>=2016-09-06T00:00:00Z&time<=2016-11-07T00:00:00Z

In [6]:
# List last ten records
df_sb.tail(10)


Out[6]:
station depth longitude latitude attenuation sigma_t temperature salinity
time
2016-11-06 15:00:00 E01 87.0 -69.35583 43.715782 0.765016 25.264053 12.194 33.340233
2016-11-06 16:00:00 E01 87.0 -69.35583 43.715782 0.705492 25.263834 12.190 33.338970
2016-11-06 17:00:00 E01 87.0 -69.35583 43.715782 0.840825 25.267359 12.186 33.342533
2016-11-06 18:00:00 E01 87.0 -69.35583 43.715782 0.426201 25.266167 12.195 33.343200
2016-11-06 19:00:00 E01 87.0 -69.35583 43.715782 0.547150 25.269737 12.185 33.345356
2016-11-06 20:00:00 E01 87.0 -69.35583 43.715782 0.462613 25.270565 12.207 33.351803
2016-11-06 21:00:00 E01 87.0 -69.35583 43.715782 0.233086 25.249554 12.230 33.330357
2016-11-06 22:00:00 E01 87.0 -69.35583 43.715782 0.575899 25.237942 12.216 33.311962
2016-11-06 23:00:00 E01 87.0 -69.35583 43.715782 0.624006 25.238604 12.211 33.311590
2016-11-07 00:00:00 E01 87.0 -69.35583 43.715782 0.660521 25.259119 12.203 33.336075

In [7]:
df_sb['sigma_t'].plot(figsize=(12,4),title=df_sb['station'][0]);plt.legend(loc=2)
df_sb['attenuation'].plot(figsize=(12,4),secondary_y=True,legend=True);



In [8]:
p1=df_met['wind_speed'].plot(figsize=(12,4),x_compat=True);plt.legend(loc=2)
p2=df_wave['significant_wave_height'].plot(secondary_y=True,legend=True,x_compat=True);



In [9]:
df_wave.plot(figsize=(12,4));



In [10]:
plt.scatter(df_sb['sigma_t'],df_sb['attenuation'])
plt.grid()



In [11]:
def tsplot(sobs,tobs):
    smin=sobs.min()
    smax=sobs.max()
    tmin=tobs.min()
    tmax=tobs.max()
    s_inc=(smax-smin)/8.
    t_inc=(tmax-tmin)/8.
    t = np.arange(tmin,tmax+t_inc,t_inc)
    s = np.arange(smin,smax+s_inc,s_inc)
    S, T = np.meshgrid(s, t)
    st = sw.dens0(S, T) - 1000
    st_inc=(st.max()-st.min())/8.
    levels = np.arange(st.min(),st.max()+st_inc,st_inc)
    from matplotlib import rcParams
    from matplotlib.ticker import MultipleLocator
    rcParams['xtick.direction'] = 'out'
    rcParams['ytick.direction'] = 'out'
    fig, ax = plt.subplots(figsize=(6, 4))
 #   ax.xaxis.set_minor_locator(MultipleLocator(0.1))
 #   ax.yaxis.set_minor_locator(MultipleLocator(1))
    ax.set_ylabel(u"Temperature \u00b0C")
    ax.set_xlabel(r"Salinity [g kg$^{-1}$]")
    ax.axis([smin,smax,tmin,tmax])

    cs = ax.contour(s, t, st, colors='black', levels=levels)
    ax.clabel(cs, fontsize=9, inline=1, fmt='%3.2f')
    #sg = ax.contour(s, t, sigma_theta, linestyle='--', colors='grey', levels=[0, line])
    #ax.clabel(sg, fontsize=9, inline=1, fmt='%2.1f')
    ax.plot(sobs,tobs,'o')

In [12]:
tsplot(df_sb['salinity'],df_sb['temperature'])



In [ ]:


In [ ]: