diff --git a/SEPTREFHUM.py b/SEPTREFHUM.py index c64ec7454095e7d6ed94d882f624f63ed5662513..34666017ec6abeb64feb1bd82e16496f9f3c8373 100755 --- a/SEPTREFHUM.py +++ b/SEPTREFHUM.py @@ -6,6 +6,10 @@ from datetime import datetime, timedelta # TODO: Figure out where files will be collected from and stored to. infile_path = "in/" outfile_path = "out/" + +# Remove all out files +subprocess.run("rm %s*.nc" % outfile_path, shell=True) + weatherdata_files = glob.glob("%sanalysis-*.nc" % infile_path) # Iterate the set of hourly weather data files @@ -17,15 +21,58 @@ for file in weatherdata_files: # Produce daily files with WH_SUM, which is the number of "Wet hours" (WH) for a given day # WH is defined as RR > 0.2 || UM > 88.0 subprocess.run( - 'cdo -setdate,%s -settime,22:00:00 -chname,WH,WH_SUM -timsum -selname,WH -aexpr,"WH = RR > 0.2 || UM > 88.0 ? 1 : 0;" %s %swh_%s.nc' % (wh_sum_date.strftime("%Y-%m-%d"), file, outfile_path, file_date), + 'cdo -setdate,%s -settime,22:00:00 -chname,WH,WH_DAYSUM -timsum -selname,WH -aexpr,"WH = RR > 0.2 || UM > 88.0 ? 1 : 0;" %s %swh_%s.nc' % (wh_sum_date.strftime("%Y-%m-%d"), file, outfile_path, file_date), shell=True ) + # Concatenate daily files > one file with daily values subprocess.run( - 'cdo -O mergetime %swh_*.nc %swh.nc' % (outfile_path, outfile_path), + 'cdo -O mergetime %swh_*.nc %swh_daysum.nc' % (outfile_path, outfile_path), shell=True ) -# TODO: Add sum of WH_SUM[yesterday] + WH_SUM[today] + WH_SUM[tomorrow] +# Add sum of WH_SUM[yesterday] + WH_SUM[today] + WH_SUM[tomorrow] +# timselsum skips every 3 steps when summing 3 timestemps, so we must +# create three different files and then merge them +subprocess.run('cdo timselsum,3,0 out/wh_daysum.nc out/wh_3daysum_tmp_0.nc', shell=True) +subprocess.run('cdo timselsum,3,1 out/wh_daysum.nc out/wh_3daysum_tmp_1.nc', shell=True) +subprocess.run('cdo timselsum,3,2 out/wh_daysum.nc out/wh_3daysum_tmp_2.nc', shell=True) + +subprocess.run('cdo -mergetime out/wh_3daysum_tmp_*.nc out/wh_3daysum_tmp_merged.nc', shell=True) + +# the last timesteps are most likely wrong, due to lack of "tomorrows" when performing timselsum +# To remove the last ones: +# +# The variable time_bnds (which has two dimensions: time and bnds. bnds is size 2) contains the +# time (in seconds) between the first and last timesteps used for summing up. e.g like this: +# $ ncdump -v time_bnds out/wh_3daysum.nc +# time_bnds = +# 1696111200, 1696284000, +# 1696197600, 1696370400, +# 1696284000, 1696456800, +# 1696370400, 1696543200, +# 1696456800, 1696629600, +# 1696543200, 1696716000, +# 1696629600, 1696716000, +# 1696716000, 1696716000; +#} +# The difference [1] - [0] should be 172800 seconds = 47 hours +# Timesteps with [1] - [0] != 172800 should be discarded +# Using netCDF4 to accomplish this + +import netCDF4 as nc +import numpy as np + + +wh_3daysum = nc.Dataset('out/wh_3daysum_tmp_merged.nc', 'r') +time_bnds = wh_3daysum.variables["time_bnds"][:] +# Assuming that wrong time bounds only exist at the end of the time series, this works +number_of_timesteps_to_remove = 0 +for time_bnd in time_bnds: + if time_bnd[1]-time_bnd[0] != 172800.0: + number_of_timesteps_to_remove = number_of_timesteps_to_remove + 1 +wh_3daysum.close() +number_of_timesteps_to_keep = len(time_bnds) - number_of_timesteps_to_remove +subprocess.run('cdo -seltimestep,1/%s out/wh_3daysum_tmp_merged.nc out/wh_3daysum.nc' % number_of_timesteps_to_keep, shell=True)