185 lines
7.0 KiB
Python
185 lines
7.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Script to comapre EFDC boundry conditions against observations
|
|
"""
|
|
|
|
import noaa_coops as noaa
|
|
from solarpy import beam_irradiance, irradiance_on_plane
|
|
from datetime import datetime, timedelta
|
|
|
|
import pandas as pd
|
|
import matplotlib.pyplot as plt
|
|
import matplotlib.dates as mdates
|
|
import numpy as np
|
|
import geopandas as gp
|
|
gp.io.file.fiona.drvsupport.supported_drivers['KML'] = 'rw'
|
|
|
|
import scipy as sp
|
|
import scipy.ndimage
|
|
#from astropy.convolution import Gaussian2DKernel
|
|
import contextily as ctx
|
|
import os
|
|
from shapely.geometry import Point
|
|
|
|
import pickle
|
|
|
|
# %% Import NOAA CO-OPS data at the battery
|
|
theBattery = noaa.Station(8518750)
|
|
|
|
df_air_temperature = theBattery.get_data(
|
|
begin_date="20120101",
|
|
end_date="20121231",
|
|
product="air_temperature",
|
|
units="metric",
|
|
time_zone="gmt")
|
|
|
|
df_air_temperature['DateTime'] = df_air_temperature.index
|
|
df_air_temperature['DateTime'] = df_air_temperature['DateTime'].dt.tz_localize('UTC')
|
|
|
|
|
|
df_water_temperature = theBattery.get_data(
|
|
begin_date="20120101",
|
|
end_date="20121231",
|
|
product="water_temperature",
|
|
units="metric",
|
|
time_zone="gmt")
|
|
|
|
df_water_temperature['DateTime'] = df_water_temperature.index
|
|
df_water_temperature['DateTime'] = df_water_temperature['DateTime'].dt.tz_localize('UTC')
|
|
|
|
# %% Read in EFDC met bounds
|
|
# WEATHER DATA FOR TIME SERIES N
|
|
# TASER(M,N) = TIME WHEN THE DATA WAS COLLECTED, IT IS IN DAY IF TCASER(N) IS 86400.
|
|
# PATM(M,N) = ATMOSPHERIC [PRESSURE MILLIBAR]
|
|
# TDRY(M,N) = DRY BULB ATMOSPHERIC TEMPERATURE [DEGREE C) ISTOPT(2)=1 OR EQUIL TEMP
|
|
# ISTOPT(2)=2; AQ VERSION SETS ISTOPT(2)=1.
|
|
# TWET(M,N) = WET BULB ATM TEMP IF IRELH=0, RELATIVE HUMIDITY (BETWEEN 0 AND 1) IF
|
|
# IRELH=1
|
|
# RAIN(M,N) = RAIN FALL RATE LENGTH/TIME, IT IS INCH/DAY IF RAINCVT IS SET TO 7.055560e-006
|
|
# (=0.0254/3600.)
|
|
# EVAP(M,N) = EVAPORATION RATE IF EVAPCVT>0.
|
|
# SOLSWR(M,N) = SOLAR SHORT WAVE RADIATION AT WATER SURFACE ENERGY FLUX/UNIT AREA.
|
|
# IT IS IN W/M2 IF SOLRCVT = 1.
|
|
# CLOUD(M,N) = FRACTIONAL CLOUD COVER
|
|
efdc_air_in = pd.read_csv('//ott-athena/E/INPUT_FILES/BC_WEATHER/20191206/files/NC_bc_weather_2012_191206.inp',
|
|
delim_whitespace=True, skiprows=10,
|
|
names=['TASER', 'PATM', 'TDRY', 'TWET', 'RAIN', 'EVAP', 'SOLSWR', 'CLOUD'])
|
|
|
|
# Remove final row
|
|
efdc_air_in.drop(efdc_air_in.tail(1).index, inplace=True)
|
|
# Correct type
|
|
efdc_air_in['TASER'] = efdc_air_in['TASER'].astype(float)
|
|
|
|
# Create datetime index
|
|
efdc_air_in['DateTime'] = pd.to_datetime(efdc_air_in['TASER'], unit='D', origin=pd.Timestamp('2012-01-01')).\
|
|
dt.tz_localize('EST').dt.tz_convert('UTC')
|
|
|
|
efdc_air_in.set_index('DateTime', inplace=True)
|
|
|
|
|
|
# %% Read in EFDC Water Temperature Bounds
|
|
|
|
efdc_water_in = pd.read_csv('//ott-athena/E/INPUT_FILES/TEMPERATURE_FILES/RM_North_RM_South/190423/NC_bc_temp_Yr2012_20190423.inp',
|
|
delim_whitespace=True, skiprows=16,
|
|
names=['TASER', 'L1', 'L2', 'L3', 'L4', 'L5', 'L6', 'L7', 'L8', 'L9', 'L10'])
|
|
|
|
# Find row when the next boundry is reached and create new df
|
|
efdc_water_South = efdc_water_in.iloc[0:np.where(efdc_water_in['TASER'] == 'AQEA_QA_QC')[0][0], :].copy()
|
|
efdc_water_North = efdc_water_in.iloc[np.where(efdc_water_in['TASER'] == 'AQEA_QA_QC')[0][0]+2:
|
|
np.where(efdc_water_in['TASER'] == 'AQEA_QA_QC')[0][1], :].copy()
|
|
|
|
# Correct type
|
|
efdc_water_South.iloc[:, 0] = efdc_water_South.iloc[:, 0].astype(float)
|
|
efdc_water_North.iloc[:, 0] = efdc_water_North.iloc[:, 0].astype(float)
|
|
|
|
# Create datetime index
|
|
efdc_water_South['DateTime'] = pd.to_datetime(efdc_water_South['TASER'], unit='D', origin=pd.Timestamp('2012-01-01')).\
|
|
dt.tz_localize('EST').dt.tz_convert('UTC')
|
|
|
|
efdc_water_South.set_index('DateTime', inplace=True)
|
|
|
|
efdc_water_North['DateTime'] = pd.to_datetime(efdc_water_North['TASER'], unit='D', origin=pd.Timestamp('2012-01-01')).\
|
|
dt.tz_localize('EST').dt.tz_convert('UTC')
|
|
efdc_water_North.set_index('DateTime', inplace=True)
|
|
|
|
del efdc_water_in
|
|
|
|
# %% Import Clear Sly radiation
|
|
|
|
vnorm = np.array([0, 0, -1])
|
|
h = 0 # sea-level
|
|
# date = np.arange(datetime(2012, 1, 1), datetime(2012, 12, 31), timedelta(hours=1)).astype(datetime)
|
|
solar_date = [datetime(2012, 1, 1) + timedelta(minutes=i) for i in range(0, 60 * 24 * 365, 60)]
|
|
solar_date_utc = pd.date_range(start=datetime(2012, 1, 1), end=datetime(2012, 12, 31), freq='1H').tz_localize('EST')
|
|
|
|
lat = 40.7128 # southern hemisphere
|
|
|
|
# solar_rad = [beam_irradiance(h, i, lat) for i in solar_date]
|
|
solar_rad = [irradiance_on_plane(vnorm, h, i, lat) for i in solar_date]
|
|
|
|
|
|
# %% Merge the dataframes
|
|
|
|
# met_merged = pd.merge(df_air_temperature, efdc_air_in, how='outer', left_index=True, right_index=True)
|
|
met_merged = pd.merge_ordered(df_air_temperature, efdc_air_in, on='DateTime',
|
|
how='outer', fill_method='ffill')
|
|
|
|
waterTempSouth_merged = pd.merge_ordered(df_water_temperature, efdc_water_South, on='DateTime',
|
|
how='outer', fill_method='ffill')
|
|
|
|
waterTempNorth_merged = pd.merge_ordered(df_water_temperature, efdc_water_North, on='DateTime',
|
|
how='outer', fill_method='ffill')
|
|
|
|
|
|
#%% Plot air temperature
|
|
|
|
fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(6, 6))
|
|
|
|
# efdc_air_in['TDRY'].plot(ax=axes, color='black', label='EFDC Air Temperature')
|
|
# df_air_temperature['air_temp'].plot(ax=axes, color='blue', label='Obs at The Battery')
|
|
# axes.set_xlim(pd.to_datetime('2012-08-01'), pd.to_datetime('2012-08-31'))
|
|
|
|
# efdc_water_North['L10'].astype(float).plot(ax=axes, color='blue', label='EFDC North Boundry L10')
|
|
# efdc_water_North['L5'].astype(float).plot(ax=axes, color='red', label='EFDC North Boundry L5')
|
|
# efdc_water_North['L1'].astype(float).plot(ax=axes, color='green', label='EFDC North Boundry L1')
|
|
|
|
efdc_water_South['L10'].astype(float).plot(ax=axes, color='blue', label='EFDC South Boundry L10')
|
|
efdc_water_South['L5'].astype(float).plot(ax=axes, color='red', label='EFDC South Boundry L5')
|
|
efdc_water_South['L1'].astype(float).plot(ax=axes, color='green', label='EFDC South Boundry L1')
|
|
|
|
df_water_temperature['water_temp'].plot(ax=axes, color='black', label='Obs at The Battery')
|
|
axes.set_xlim(pd.to_datetime('2012-08-01'), pd.to_datetime('2012-08-31'))
|
|
|
|
axes.set_ylabel('Temperature (deg C)')
|
|
axes.set_xlabel('Date')
|
|
axes.legend()
|
|
|
|
# axes.scatter(met_merged['TDRY'], met_merged['air_temp'])
|
|
# axes.scatter(waterTempSouth_merged['water_temp'], waterTempSouth_merged['L5'])
|
|
# axes.scatter(waterTempNorth_merged['water_temp'], waterTempSouth_merged['L5'])
|
|
|
|
plt.show()
|
|
|
|
#%% Plot Solar Radiation
|
|
|
|
fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(6, 6))
|
|
|
|
efdc_air_in['SOLSWR'].plot(ax=axes, color='black', label='EFDC Air Temperature')
|
|
axes.plot(solar_date_utc[0:-1], solar_rad, color='blue', label='Solar Radiation')
|
|
|
|
axes.set_xlim(pd.to_datetime('2012-08-01'), pd.to_datetime('2012-08-07'))
|
|
|
|
axes.set_ylabel('Solar Radiation (w/m^2)')
|
|
axes.set_xlabel('Date')
|
|
axes.legend()
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|