def calculate_daily_mean_fields(): dates, clim_fields_hcd_rl = Crcm5ModelDataManager.hdf_get_daily_climatological_fields( hdf_db_path="/skynet3_rech1/huziy/hdf_store/quebec_0.1_crcm5-hcd-rl_spinup.hdf", var_name="STFL", level_index=None, use_grouping=True, start_year=1979, end_year=1988) dates, clim_fields_hcd_rl_intfl = Crcm5ModelDataManager.hdf_get_daily_climatological_fields( hdf_db_path="/skynet3_rech1/huziy/hdf_store/quebec_0.1_crcm5-hcd-rl-intfl_spinup.hdf", var_name="STFL", level_index=None, use_grouping=True, start_year=1979, end_year=1988) # Calculate mean timeseries and take a difference ts_hcd_rl = [] for field in clim_fields_hcd_rl: field = np.asarray(field) ts_hcd_rl.append(field[field >= 0].mean()) ts_hcd_rl = np.asarray(ts_hcd_rl) ts_hcd_rl_intfl = [] for field in clim_fields_hcd_rl_intfl: field = np.asarray(field) ts_hcd_rl_intfl.append(field[field >= 0].mean()) ts_hcd_rl_intfl = np.asarray(ts_hcd_rl_intfl) daily_diff_data = (ts_hcd_rl_intfl - ts_hcd_rl) / ts_hcd_rl * 100 daily_diff_ts = pd.TimeSeries(data=daily_diff_data, index=dates) monthly_diff_ts = daily_diff_ts.resample("M", how="mean") month_vals = np.asarray([d.month for d in dates]) month_mean_for_day = np.zeros(len(month_vals)) fig = plt.figure(figsize=(20, 6)) ax = plt.gca() assert isinstance(ax, Axes) ax.set_ylabel("$\left(Q_{\\rm hcd-rl-intfl} - Q_{\\rm hcd-rl}\\right)/Q_{\\rm hcd-rl} \\times 100\%$") ax.plot(dates, daily_diff_data) ax.plot(ax.get_xlim(), [0, 0], "k-") # plot a mean for each month for the_month in range(1, 13): month_mean_for_day[month_vals == the_month] = monthly_diff_ts[the_month - 1] month_dates = list(filter(lambda d: d.month == the_month, dates)) month_vals = np.ones((len(month_dates),)) * monthly_diff_ts[the_month - 1] ax.plot(month_dates, month_vals, "r", lw=1.5) ax.grid("on") ax.xaxis.set_major_formatter(DateFormatter("%b/%d")) ax.xaxis.set_major_locator(DayLocator(bymonthday=1)) plt.tight_layout() plt.savefig("intfl_diff.png")
def get_daily_climatology(path_to_hdf_file="", var_name="STFL", level=None, start_year=None, end_year=None): # if the difference of 2 variables is requested opsign = "-" if "-" in var_name else "+" if "+" in var_name else None if "-" in var_name or "+" in var_name: v1name, v2name = var_name.replace(" ", "").split(opsign) dates, v1data = get_daily_climatology(path_to_hdf_file=path_to_hdf_file, level=level, start_year=start_year, end_year=end_year, var_name=v1name) _, v2data = get_daily_climatology(path_to_hdf_file=path_to_hdf_file, level=level, start_year=start_year, end_year=end_year, var_name=v2name) return dates, v1data - v2data if opsign == "-" else v1data + v2data if opsign == "+" else None if var_name.endswith("_min"): return get_daily_min_climatology(path_to_hdf_file=path_to_hdf_file, var_name=var_name, level=level, start_year=start_year, end_year=end_year) elif var_name.endswith("_max"): return get_daily_max_climatology(path_to_hdf_file=path_to_hdf_file, var_name=var_name, level=level, start_year=start_year, end_year=end_year) else: return Crcm5ModelDataManager.hdf_get_daily_climatological_fields(hdf_db_path=path_to_hdf_file, start_year=start_year, end_year=end_year, var_name=var_name, level_index=level, use_grouping=True)