@@ -8,19 +8,50 @@ struct Climate
88 # t_id::Union{String, Nothing} = nothing
99end
1010
11-
1211"""
13- subcatchment_data(node::NetworkNode, climate::Climate)
12+ Extract streamflow data from file.
1413
15- Extract all data for a given node from climate object.
14+ Streamflow (Q) column is identified the Gauge ID.
15+
16+ Flow data is identified with the suffix `_Q` by default
17+ e.g., ("000001_Q")
18+
19+ # Arguments
20+ - `data` : Observation data
21+ - `gauge_id` : Gauge/Node ID
22+ - `suffix` : Suffix used to indicate flow data (default: "_Q")
23+
24+ # Returns
25+ DataFrame of observations for selected gauge.
1626"""
17- function subcatchment_data (node:: NetworkNode , climate:: Climate ):: DataFrame
18- data = climate. climate_data
19- cols = filter (x -> occursin (node. name, string (x)), names (data))
27+ @inline function extract_flow (
28+ data:: DataFrame , gauge_id:: String , suffix:: String = " _Q"
29+ ):: DataFrame
30+ target = data[:, [" Date" , gauge_id * suffix]]
31+ rename! (target, gauge_id * suffix => gauge_id)
2032
21- return data[:, vcat ([ " Date " ], cols)]
33+ return target
2234end
2335
36+ """
37+ Create a climate dataset of Precipitation (P) and Potential Evapotranspiration (PET).
38+ Data for multiple gauges may be defined in a single dataset.
39+
40+ P and PET columns are identified by `_P` and `_PET` suffixes by default.
41+
42+ # Arguments
43+ - `data` : Observation data
44+ - `P_suffix` : Suffix used to indicate precipitation (default: "_P")
45+ - `PET_suffix` : Suffix used to indicate Potential Evapotranspiration (default: "_PET")
46+
47+ # Returns
48+ Climate
49+ """
50+ @inline function extract_climate (
51+ data:: DataFrame ; P_suffix:: String = " _P" , PET_suffix:: String = " _PET"
52+ ):: Climate
53+ return Climate (data, P_suffix, PET_suffix)
54+ end
2455
2556"""
2657 rainfall_data(node::NetworkNode, climate::Climate)::DataFrame
@@ -29,27 +60,38 @@ Extract rainfall data for a given node.
2960"""
3061function rainfall_data (node:: NetworkNode , climate:: Climate ):: DataFrame
3162 data = climate. climate_data
32- rain_col = filter (x -> occursin (node. name, x)
33- & occursin (climate. rainfall_id, x),
63+ rain_col = filter (x -> occursin (node. name, x)
64+ & occursin (climate. rainfall_id, x),
3465 names (data))[1 ]
3566
3667 return data[:, rain_col]
3768end
3869
70+ """
71+ subcatchment_data(node::NetworkNode, climate::Climate)
72+
73+ Extract all data for a given node from climate object.
74+ """
75+ function subcatchment_data (node:: NetworkNode , climate:: Climate ):: DataFrame
76+ data = climate. climate_data
77+ cols = filter (x -> occursin (node. name, string (x)), names (data))
78+
79+ return data[:, vcat ([" Date" ], cols)]
80+ end
3981
4082"""
4183 climate_values(node::NetworkNode, climate::Climate, timestep::Int)
4284
4385Extract climate related data for a given time step.
4486"""
45- function climate_values (node:: NetworkNode , climate:: Climate ,
87+ function climate_values (node:: NetworkNode , climate:: Climate ,
4688 timestep:: Int )
4789 node_name:: String = node. name
4890 data:: DataFrame = climate. climate_data
4991
5092 # TODO : Catch instances where data is not found (raises BoundsError)
51- rain_col = filter (x -> occursin (node_name, x)
52- & occursin (climate. rainfall_id, x),
93+ rain_col = filter (x -> occursin (node_name, x)
94+ & occursin (climate. rainfall_id, x),
5395 names (data))[1 ]
5496 et_col = filter (x -> occursin (node_name, x)
5597 & occursin (climate. et_id, x),
66108"""
67109 climate_values(node::NetworkNode, climate::Climate)
68110
69- Extract climate related data for a given time step .
111+ Extract climate related data.
70112"""
71113function climate_values (node:: NetworkNode , climate:: Climate )
72114 data:: DataFrame = climate. climate_data
73115
74116 # TODO : Catch instances where data is not found (raises BoundsError)
75- rain_col = filter (x -> occursin (node. name, x)
76- & occursin (climate. rainfall_id, x),
117+ rain_col = filter (x -> occursin (node. name, x)
118+ & occursin (climate. rainfall_id, x),
77119 names (data))[1 ]
78120 et_col = filter (x -> occursin (node. name, x)
79121 & occursin (climate. et_id, x),
0 commit comments