def get_ndbc(start, end, bbox , sos_name='waves',datum='MSL', verbose=True): """ function to read NBDC data ################### sos_name = waves all_col = (['station_id', 'sensor_id', 'latitude (degree)', 'longitude (degree)', 'date_time', 'sea_surface_wave_significant_height (m)', 'sea_surface_wave_peak_period (s)', 'sea_surface_wave_mean_period (s)', 'sea_surface_swell_wave_significant_height (m)', 'sea_surface_swell_wave_period (s)', 'sea_surface_wind_wave_significant_height (m)', 'sea_surface_wind_wave_period (s)', 'sea_water_temperature (c)', 'sea_surface_wave_to_direction (degree)', 'sea_surface_swell_wave_to_direction (degree)', 'sea_surface_wind_wave_to_direction (degree)', 'number_of_frequencies (count)', 'center_frequencies (Hz)', 'bandwidths (Hz)', 'spectral_energy (m**2/Hz)', 'mean_wave_direction (degree)', 'principal_wave_direction (degree)', 'polar_coordinate_r1 (1)', 'polar_coordinate_r2 (1)', 'calculation_method', 'sampling_rate (Hz)', 'name']) sos_name = winds all_col = (['station_id', 'sensor_id', 'latitude (degree)', 'longitude (degree)', 'date_time', 'depth (m)', 'wind_from_direction (degree)', 'wind_speed (m/s)', 'wind_speed_of_gust (m/s)', 'upward_air_velocity (m/s)', 'name']) """ #add remove from above if sos_name == 'waves': col = ['sea_surface_wave_significant_height (m)','sea_surface_wave_peak_period (s)', 'sea_surface_wave_mean_period (s)','sea_water_temperature (c)', 'sea_surface_wave_to_direction (degree)'] elif sos_name == 'winds': col = ['wind_from_direction (degree)','wind_speed (m/s)', 'wind_speed_of_gust (m/s)','upward_air_velocity (m/s)'] collector = NdbcSos() collector.set_bbox(bbox) collector.start_time = start collector.variables = [sos_name] ofrs = collector.server.offerings title = collector.server.identification.title collector.features = None collector.end_time = start + datetime.timedelta(1) response = collector.raw(responseFormat='text/csv') df = pd.read_csv(BytesIO(response), parse_dates=True) g = df.groupby('station_id') df = dict() for station in g.groups.keys(): df.update({station: g.get_group(station).iloc[0]}) df = pd.DataFrame.from_dict(df).T station_dict = {} for offering in collector.server.offerings: station_dict.update({offering.name: offering.description}) names = [] for sta in df.index: names.append(station_dict.get(sta, sta)) df['name'] = names #override short time collector.end_time = end data = [] for k, row in df.iterrows(): station_id = row['station_id'].split(':')[-1] collector.features = [station_id] response = collector.raw(responseFormat='text/csv') kw = dict(parse_dates=True, index_col='date_time') obs = pd.read_csv(BytesIO(response), **kw).reset_index() obs = obs.drop_duplicates(subset='date_time').set_index('date_time') series = obs[col] series._metadata = dict( station=row.get('station_id'), station_name=row.get('name'), station_code=str(row.get('station_id').split(':')[-1]), sensor=row.get('sensor_id'), lon=row.get('longitude (degree)'), lat=row.get('latitude (degree)'), depth=row.get('depth (m)'), ) data.append(series) # Clean the table. table = dict( station_name = [s._metadata.get('station_name') for s in data], station_code = [s._metadata.get('station_code') for s in data], sensor = [s._metadata.get('sensor') for s in data], lon = [s._metadata.get('lon') for s in data], lat = [s._metadata.get('lat') for s in data], depth = [s._metadata.get('depth', 'NA') for s in data], ) table = pd.DataFrame(table).set_index('station_name') if verbose: print('Collector offerings') print('{}: {} offerings'.format(title, len(ofrs))) return data, table