AJMR-Python-Baird/LSU_D3D/PENOB_EnvDat.py

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()