204 lines
7.7 KiB
Python
204 lines
7.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Script grab and process bound data for the Penobscot
|
|
"""
|
|
|
|
import noaa_coops as noaa
|
|
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
|
|
|
|
import dataretrieval.nwis as nwis
|
|
|
|
# %% Import USGS data from selected stations
|
|
|
|
# Bangor, Maine:
|
|
# Gage height from 2012-10-01 to 2022-06-23
|
|
site = '01037050'
|
|
# Get usgs data
|
|
Bangor_df = nwis.get_record(sites=site, service='iv', start='2013-01-01', end='2022-01-01')
|
|
# Convert downloaded data to pandas datetime
|
|
Bangor_df['pd_Datetime'] = pd.to_datetime(Bangor_df.index, format='%Y-%m-%dT%H:%M:%S.%f%z')
|
|
# Convert datetime to UTC. Use apply since time zones may vary
|
|
Bangor_df['pd_Datetime'] = Bangor_df['pd_Datetime'].apply(lambda x: x.tz_convert('UTC'))
|
|
# Set the converted datetimes as a datetimeindex
|
|
Bangor_df.set_index(pd.DatetimeIndex(Bangor_df['pd_Datetime']), inplace=True)
|
|
|
|
# West Enfield, Maine:
|
|
# Upstream from project
|
|
# Discharge from 1990-09-22 to 2022-06-23
|
|
# Gage from 2007-10-01 to 2022-06-23
|
|
site = '01034500'
|
|
Enfield_df = nwis.get_record(sites=site, service='iv', start='1990-09-22', end='2022-01-01',
|
|
parameterCd='00060,00065')
|
|
Enfield_df['pd_Datetime'] = pd.to_datetime(Enfield_df.index, format='%Y-%m-%dT%H:%M:%S.%f%z')
|
|
Enfield_df['pd_Datetime'] = Enfield_df['pd_Datetime'].apply(lambda x: x.tz_convert('UTC'))
|
|
Enfield_df.set_index(pd.DatetimeIndex(Enfield_df['pd_Datetime']), inplace=True)
|
|
|
|
|
|
# Eddington, Maine:
|
|
# Discharge from 1979-04-06 to 1996-09-30
|
|
# Gage from 1998-10-01 to 2022-06-22
|
|
site = '01036390'
|
|
Eddington_df = nwis.get_record(sites=site, service='iv', start='1990-09-22', end='2022-01-01',
|
|
parameterCd='00060,00065')
|
|
Eddington_df['pd_Datetime'] = pd.to_datetime(Eddington_df.index, format='%Y-%m-%dT%H:%M:%S.%f%z')
|
|
Eddington_df['pd_Datetime'] = Eddington_df['pd_Datetime'].apply(lambda x: x.tz_convert('UTC'))
|
|
Eddington_df.set_index(pd.DatetimeIndex(Eddington_df['pd_Datetime']), inplace=True)
|
|
|
|
|
|
# Kenduskeag Stream, Maine:
|
|
# Discharge from 2010-02-28 to 2022-06-23
|
|
# Gage from 2009-12-22 to 2022-06-23
|
|
site = '01037000'
|
|
Kenduskeag_df = nwis.get_record(sites=site, service='iv', start='1990-09-22', end='2022-01-01',
|
|
parameterCd='00060,00065')
|
|
Kenduskeag_df['pd_Datetime'] = pd.to_datetime(Kenduskeag_df.index, format='%Y-%m-%dT%H:%M:%S.%f%z')
|
|
Kenduskeag_df['pd_Datetime'] = Kenduskeag_df['pd_Datetime'].apply(lambda x: x.tz_convert('UTC'))
|
|
Kenduskeag_df.set_index(pd.DatetimeIndex(Kenduskeag_df['pd_Datetime']), inplace=True)
|
|
|
|
|
|
## Validation sites
|
|
# Winterport, Maine:
|
|
# Gage from 2017-09-01 to 2017-12-01
|
|
site = '443810068502201'
|
|
Winterport_df = nwis.get_record(sites=site, service='iv', start='2017-09-01', end='2017-12-01',
|
|
parameterCd='00065')
|
|
Winterport_df['pd_Datetime'] = pd.to_datetime(Winterport_df.index, format='%Y-%m-%dT%H:%M:%S.%f%z')
|
|
Winterport_df['pd_Datetime'] = Winterport_df['pd_Datetime'].apply(lambda x: x.tz_convert('UTC'))
|
|
Winterport_df.set_index(pd.DatetimeIndex(Winterport_df['pd_Datetime']), inplace=True)
|
|
|
|
|
|
# Bucksport, Maine:
|
|
# Gage from 2017-09-01 to 2017-12-01
|
|
site = '443409068471801'
|
|
Bucksport_df = nwis.get_record(sites=site, service='iv', start='2017-09-01', end='2017-12-01',
|
|
parameterCd='00065')
|
|
Bucksport_df['pd_Datetime'] = pd.to_datetime(Bucksport_df.index, format='%Y-%m-%dT%H:%M:%S.%f%z')
|
|
Bucksport_df['pd_Datetime'] = Bucksport_df['pd_Datetime'].apply(lambda x: x.tz_convert('UTC'))
|
|
Bucksport_df.set_index(pd.DatetimeIndex(Bucksport_df['pd_Datetime']), inplace=True)
|
|
|
|
# FortPoint, Maine:
|
|
# Gage from 2017-09-01 to 2017-12-01
|
|
site = '442810068480101'
|
|
FortPoint_df = nwis.get_record(sites=site, service='iv', start='2017-09-01', end='2017-12-01',
|
|
parameterCd='00065')
|
|
FortPoint_df['pd_Datetime'] = pd.to_datetime(FortPoint_df.index, format='%Y-%m-%dT%H:%M:%S.%f%z')
|
|
FortPoint_df['pd_Datetime'] = FortPoint_df['pd_Datetime'].apply(lambda x: x.tz_convert('UTC'))
|
|
FortPoint_df.set_index(pd.DatetimeIndex(FortPoint_df['pd_Datetime']), inplace=True)
|
|
|
|
|
|
# %% Approach
|
|
|
|
# Corrleate upstream discharge at West Enfield with discharge at project site in Eddington, Maine
|
|
# from 1990-09-22 (start of Enfield) to 1996-09-30 (end of Eddington)
|
|
# Try scaling factor, othersie use gague
|
|
|
|
# Generate estimated discharge at Eddington from 2017-09-01 to 2017-12-01 using scaling factor
|
|
|
|
# Add in flow from Kenduskeag Stream to get discharge at Bangor
|
|
|
|
# Read in NOAA @ Bar Harbor from 2017-09-01 to 2017-12-01
|
|
|
|
# Compare NOAA @ Bar Harbor with USGS Fort Point
|
|
|
|
# Save Csv files of discharge at Eddington & WL @ Bar Harbor & WL @ Bangor
|
|
|
|
# Run model
|
|
|
|
# Compare against WL @ Winterport & Bucksport & Fort Point
|
|
|
|
|
|
# %% Import NOAA CO-OPS data at Bar Harbor
|
|
barHarbor = noaa.Station(8413320)
|
|
|
|
barHarbor_df = barHarbor.get_data(
|
|
begin_date="20170901",
|
|
end_date="20171201",
|
|
product="water_level",
|
|
units="metric",
|
|
datum="MSL",
|
|
time_zone="gmt")
|
|
|
|
barHarbor_df['DateTime'] = barHarbor_df.index
|
|
barHarbor_df['DateTime'] = barHarbor_df['DateTime'].dt.tz_localize('UTC')
|
|
|
|
|
|
# %% Plot discharge at West Enfield with discharge at project site in Eddington, Maine
|
|
# from 1990-09-22 (start of Enfield) to 1996-09-30 (end of Eddington)
|
|
|
|
fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(6, 6))
|
|
|
|
Enfield_df.loc['1990-9-22':'1996-9-30', '00060'].plot(ax=axes, label='Enfield', style='-')
|
|
Eddington_df.loc['1990-9-22':'1996-9-30', '00060'].plot(ax=axes, label='Eddington', style='-')
|
|
|
|
Enfield_df.shift(freq=pd.Timedelta(hours=+12)).loc['1990-9-22':'1996-9-30', '00060'].multiply(1.05).plot(
|
|
kind='line', ax=axes, label='Enfield Shift')
|
|
axes.set_xlim(pd.to_datetime('1993-04-01'), pd.to_datetime('1993-12-01'))
|
|
|
|
|
|
# set formatter
|
|
axes.xaxis.set_major_formatter(mdates.DateFormatter('%m-%Y'))
|
|
# set font and rotation for date tick labels
|
|
plt.gcf().autofmt_xdate()
|
|
|
|
|
|
axes.set_xlabel('Date')
|
|
|
|
# scatterDF = Enfield_df
|
|
# scatterDF['Eddington'] = np.interp(scatterDF.index, Eddington_df.index,
|
|
# Eddington_df['00060'])
|
|
#
|
|
# scatterDF.plot.scatter(x='00060', y='Eddington', ax=axes)
|
|
|
|
axes.legend()
|
|
|
|
plt.show()
|
|
|
|
|
|
# %% Create discharge at Bangor by multiplying Eddington * 1.05 and shifting 12 hours + Kenduskeag
|
|
# From 2017-09-01 to 2017-12-01
|
|
# Create Delft3D .bc
|
|
|
|
Enfield_shift_df = Enfield_df.copy()
|
|
Enfield_shift_df["Enfield_shift"] = Enfield_shift_df.shift(freq=pd.Timedelta(hours=+12)).loc[:, '00060'].multiply(1.05)
|
|
Enfield_shift_df.rename(columns={'00060': "Enfield_Base", 'pd_Datetime':'pd_Datetime_Enfield'}, inplace=True)
|
|
|
|
Enfield_selShift_df = Enfield_shift_df.loc['2017-9-1':'2017-12-1', :]
|
|
Kenduskeag_sel_df = Kenduskeag_df.copy().loc['2017-9-1':'2017-12-1', :].rename(
|
|
columns={'00060': "Kenduskeag_Base", 'pd_Datetime':'pd_Datetime_Kenduskeag'})
|
|
|
|
syn_Bangor_df = pd.merge(Enfield_selShift_df, Kenduskeag_sel_df,
|
|
left_on = 'pd_Datetime_Enfield', right_on = 'pd_Datetime_Kenduskeag')
|
|
|
|
syn_Bangor_df['Enfield_shift_filna'] = syn_Bangor_df["Enfield_shift"].interpolate()
|
|
syn_Bangor_df['Kenduskeag_filna'] = syn_Bangor_df["Kenduskeag_Base"].interpolate()
|
|
|
|
syn_Bangor_df['syn_Bangor'] = syn_Bangor_df['Enfield_shift_filna'] + syn_Bangor_df["Kenduskeag_filna"]
|
|
|
|
# %% Test plot
|
|
|
|
fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(6, 6))
|
|
|
|
syn_Bangor_df.loc[:, 'syn_Bangor'].plot()
|
|
|
|
plt.show()
|
|
|
|
# %% Save as csv
|
|
|
|
syn_Bangor_df['syn_Bangor_m3'] = syn_Bangor_df['syn_Bangor'] * 0.0283168
|
|
|
|
syn_Bangor_df.loc[:, ['pd_Datetime_Enfield', 'syn_Bangor_m3']].to_csv(
|
|
'C:/Users/arey/files/Projects/Penobscot/Modelling/Inputs/syn_Bangor.csv', index=False)
|
|
|
|
barHarbor_df.loc[:, 'water_level'].to_csv(
|
|
'C:/Users/arey/files/Projects/Penobscot/Modelling/Inputs/Bar_Harbour.csv')
|
|
|
|
|
|
|
|
|