hhnk-git / legger

GNU General Public License v3.0
0 stars 1 forks source link

tijdstap einde regen detecteren en als suggeste weergeven #48

Closed wvanesse closed 8 months ago

wvanesse commented 4 years ago

In plaat van laatste tijdstap de laatste tijdstap met regen weergeven. Hiervoor hebben we al een script in een ander systeem, wellicht hebben we hier iets aan:

Input is: r = GridH5ResultAdmin(h5_file, nc_file) #Inladen resultaten conn = sqlite3.connect(folders_dict['sqlite']['sqlite_path'])

Conn (connectie naar sqlite) staat daar nog tussen maar is volgens mij niet nodig. Maar dan heb je iig een versie..

Script is: ` from future import division import pandas as pd import matplotlib as mplt import matplotlib.pyplot as plt import numpy as np

def rain_properties(r, conn): Lees uit een 3di resultaat de dag uit waarop de regen is begonnen, en geeindigd.

#dt van wegschrijven resultaten in minuten
dt = round(np.mean(np.diff(r.nodes.timestamps))/60,0)

# Index van tijdstappen van in de netcdf
timestep= r.nodes.timestamps/60 #Tijd in minuten sinds begin berekening

# De regen weggeschreven per uur
rain_1d = r.nodes.subset('1D_ALL').timeseries(indexes = slice(0, timestep.size, int(60/dt))).rain.tolist()
rain_2d = r.nodes.subset('2D_ALL').timeseries(indexes = slice(0, timestep.size, int(60/dt))).rain.tolist()

rain_1d = [x[0] for x in rain_1d] #Blijft raar in sublijsten staan ookal lezen we maar 1 node uit, dit haalt dat weg om er 1list van te maken
try: rain_2d = [x[0] for x in rain_2d]
except: rain_2d=0

if any(rain_1d):
    rain = rain_1d
elif any(rain_2d):
    rain = rain_2d
else:
    print('Kon geen neerslag vinden')

#Wanneer de regen precies valt kunnen we afleiden uit de regendata. 
#Dit gaat per dag, dus hieronder worden de dagen bepaald.
detected_rain = [i for i,e in enumerate(rain) if e >0.00001]

dagen_droog_begin = max(0, (detected_rain[0]-1)/24)
dagen_droog_eind = max(0, (len(rain)-detected_rain[-1]-1)/24)

# ------------------------------------------------------------------------------------------------------------------
# PLOTTING
# ------------------------------------------------------------------------------------------------------------------
print(
    """dagen_droog_begin = {} ({} uur)
dagen_droog_eind = {} ({} uur)
tijdstap_minuten = {} 
    """.format(round(dagen_droog_begin,3), dagen_droog_begin*24, dagen_droog_eind, dagen_droog_eind*24, dt )
    )

def create_plot(x, y, title, xlabel, ylabel):
    fig, ax = plt.subplots()
    plt.plot(x,y)
    plt.title(title)
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)
    ax.grid();
    return fig, ax

rain_plot = rain #Toevoegen zodat er rechte lijnen geplot worden
rain_plot.insert(detected_rain[-1], rain_plot[detected_rain[-1]])
rain_plot= rain_plot + [rain_plot[-1]]

# Plot de regen over de tijd
x_dagen =[0]+[x/24 for x in range(1,len(rain)-1)]

x_dagen_plot = x_dagen
x_dagen.insert(detected_rain[0]-1, x_dagen[detected_rain[0]-1])
x_dagen.insert(detected_rain[-1]+1, x_dagen[detected_rain[-1]+1])

create_plot(x_dagen, [a*100000/1.05833 for a in rain_plot], 'Neerslag', 'Tijd [dagen]', 'Neerslag [mm/dag]')

# Randen van gedetecteerde regen
plt.plot([dagen_droog_begin,dagen_droog_begin],[0,max(rain)*100000/1.05833], c='green')
plt.plot([timestep[-1]/60/24 - dagen_droog_eind,timestep[-1]/60/24 -dagen_droog_eind],[0,max(rain)*100000/1.05833], c='green')

# Polygon om deze gedeteceerde regenperiode te vullen
xy=[[dagen_droog_begin, 0], [timestep[-1]/60/24 - dagen_droog_eind, 0], [timestep[-1]/60/24 - dagen_droog_eind,max(rain)*100000/1.05833], [dagen_droog_begin,max(rain)*100000/1.05833]]
fig = plt.gcf()
ax = plt.gca()

ax.add_patch(mplt.patches.Polygon(xy, closed=True,alpha=0.2,color='green'))
plt.legend(('Neerslag','Gedetecteerde neerslagperiode'),loc='upper right',fancybox=True,framealpha=0.5);
# plt.show()
# fig.legend(['Neerslag','Gedetecteerde neerslagperiode'], bbox_to_anchor=(1, 1), bbox_transform=plt.gcf().transFigure)

# ------------------------------------------------------------------------------------------------------------------
# Tijdstappen dataframe aanmaken
# ------------------------------------------------------------------------------------------------------------------
T0 = np.argmax(timestep > 0)
T_begin_regen = np.argmax(timestep > dagen_droog_begin*24*60)
T_einde_regen_min1 = np.argmax(timestep > timestep[-1]-dagen_droog_eind*24*60 - 24*60) -1 #Een tijdstap voor het einde, omdat anders het water alweer uit zakt. 
T_einde_regen = np.argmax(timestep > timestep[-1]-dagen_droog_eind*24*60) -1
T_einde_som = np.argmax(timestep == timestep[-1])

#De index van de tijdstappen die uitgelezen moeten worden in een lijst zetten.
tijdstappen_str = ['T0', 'T_begin_regen', 'T_einde_regen_min1', 'T_einde_regen', 'T_einde_som']
tijdstappen = [T0, T_begin_regen, T_einde_regen_min1, T_einde_regen, T_einde_som] 

#En dan in een dataframe
tijdstappen = pd.DataFrame(data = [tijdstappen],columns=tijdstappen_str, index=['value'])

return dt, timestep, tijdstappen`

Hieruit moet het T einde regen min 1 gebruiken. Deze heeft zeker nog de hele tijdstap regen.