pacificclimate / climdex.pcic

Routines to compute ETCCDI Climdex indices
GNU General Public License v3.0
23 stars 13 forks source link

Climdex excludes last date of timeseries if not recorded at midnight #26

Open cwhitlock-NOAA opened 2 years ago

cwhitlock-NOAA commented 2 years ago

Hi folks,

When the input data have a timeseries that records observations at a time other than midnight, the last day of the timeseries is excluded from the climdex calculations. This happens in the climdexInput.* functions during the checks for timeseries presence; when get.last.monthday.of.year() gets the last present month-day in the timeseries it doesn't check for a corersponding time for the observation, and thus the effective time of that obs is midnight, the default value for date creation. Then, when you build date.series out of new.date.range and return the resulting climdex object, you get a timeseries that will exclude the last date when compared against the original data passed in from the tmax.dates, tmin.dates, or prec.dates.

dvals <- 0:364 bad_origin <- as.PCICt("1950-01-01 12:00:00", cal='365_day') good_origin <- as.PCICt("1950-01-01 00:00:00", cal='365_day')

bad_dates <- bad_origin + (dvals 86400) good_dates <- good_origin + (dvals 86400)

tx_vals <- c(-13.2264,-21.9066,-23.5033,-18.5307,-20.3314,-17.0860,-11.3756, -9.9083,-16.4480,-20.8689,-19.8821,-20.6430,-25.4341,-23.0985,-24.5649,-25.1936,-30.8322,-30.9141,-22.9431,-19.5981,-18.3166,-18.6143,-15.2141,-12.4404, -9.2612, -2.3836, -6.3939,-13.2837,-19.5425,-20.8688,-11.6357,-11.5852,-20.1436,-14.9506, -9.0480, -3.9262, -4.5282, -4.0509, -5.0221,-17.5509,-10.6378, -1.1876,-10.9321,-17.5218,-21.8704,-16.3821, -6.6366, -1.6671,  0.7595, -1.6152, -4.1655,-12.6717, -6.2720, -0.1628, -1.9122, -7.8311,-10.3809,-17.0585,-16.9257,-17.2465,-19.3295,-20.5165,-16.1532,-15.2424,-13.4426, -6.9774, -3.8728, -3.3317, -5.0462, -5.7957,-10.3581, -3.9735, -4.0325, -2.5948,  0.0527, -0.9765, -7.1494, -7.2262, -6.0090, -0.7502,  0.0329, -0.3068, -1.9092, -3.4711, -5.5933, -3.8504, -1.9808, -3.1178, -1.4956,  0.3871,  1.3040,  2.0782,  3.5615,  4.6416,  5.3785,  3.3277,  0.9613,  0.4652,  4.6457,  5.7247,  2.6408,  6.0294,  4.1356,  6.7348,  7.2484,  9.2355, 10.9016, 11.0097, 14.4750, 11.1746, -0.3785,  2.2083,  1.6172,  1.8711,  0.7203,  0.3579,  4.3855,  4.8626,  3.5513,  0.8733,  3.5147,  5.1806,  7.8817, 10.1947,  8.9178,  8.0417,  5.2500,  9.6710, 13.2337, 12.1818, 13.7958, 12.3425, 10.0217,  8.0065, 10.4575, 17.9395, 20.2073, 17.4538, 10.9713,  7.0088, 12.4727, 14.6087, 15.7057, 15.4002, 13.4274,  7.1753,  8.1142, 11.2934,  9.7822,  6.0289,  6.5265,  8.3596, 11.3997, 12.7346, 14.8430, 17.3144, 20.2174, 24.3375, 21.4928, 24.4396, 27.3378, 27.8392, 28.9833, 29.6897, 28.7159, 27.3353, 26.6471, 24.8466, 13.5965, 17.8687, 20.5753, 21.6617, 22.9480, 21.2123, 12.1544, 12.8316, 17.2741, 16.7999, 14.0017, 10.3469, 12.9102, 16.5582, 24.8777, 24.0519, 18.1378, 13.6339, 17.3246, 21.6421, 20.0001, 23.2039, 24.7799, 24.1712, 22.9126, 24.9325, 18.7071, 15.8320, 14.8004, 14.5217, 15.9027, 15.6273, 15.5377, 15.9363, 19.5688, 21.3377, 21.6562, 22.1099, 20.6815, 17.9167, 20.7020, 23.3151, 24.3984, 24.1073, 24.0583, 27.0810, 27.4463, 26.5555, 28.1498, 25.7686, 24.0041, 22.8128, 28.3679, 26.3796, 21.3111, 20.4708, 21.6742, 23.6510, 27.3115, 26.4073, 19.4582, 18.2295, 16.4445, 12.9655, 14.2412, 13.2205, 10.8842, 11.3202, 15.3772, 20.4002, 19.9495, 17.9794, 11.3816, 16.7198, 13.6700, 10.1560, 10.8999, 16.9979, 16.0137, 15.6911, 13.4684, 10.7050,  7.6629, 10.9237, 10.6365, 12.6482, 12.9109, 15.1210, 19.3038, 23.7522, 20.8716,  5.4969, 11.0693, 17.2961, 17.7506, 13.8554, 11.4969, 10.0743, 12.6688, 11.3720, 11.3969, 11.4339, 15.6554, 13.0771, 12.1788, 14.0207, 12.7640, 13.8946, 13.2681, 16.6384, 14.0275,  8.3640,  8.1767,  5.7048,  5.0823,  3.3285,  2.2377,  1.6497,  3.4320,  4.0160,  2.1556,  2.7022,  8.2064,  8.0891,  4.6675,  2.6251,  3.3145,  1.4476,  2.2165,  8.4356,  6.3633,  6.6286,  5.1590,  2.4342,  6.2242,  7.2180,  3.2244,  8.6773,  8.4218, 12.1111,  6.2167, -0.1805,  0.9938,  3.2967,  2.3852,  3.0964,  1.5071,  1.9203,  0.0832,  1.2409,  0.6768, -1.5301,  0.1672,  0.3671,  0.0035, -2.5390, -3.8010, -7.7359, -8.7969, -8.6596, -8.7958, -5.7739, -7.5598, -2.0814, -0.4828, -1.5534, -4.5269, -1.0193,  0.0581, -0.2959, -1.7161, -3.8526, -6.1638, -8.3235, -8.1882, -7.9895, -8.0109, -1.0751, -0.1078, -5.3024, -7.7940, -0.1877,-13.9689,-16.5386,-17.5747,-17.5375,-17.3951, -8.3610, -2.2299, -3.9048, -7.6121,-12.3502,-16.2987,-15.3880,-11.8617, -9.5922, -9.5582) tn_vals <- c(-24.264,-25.161,-30.020,-24.553,-26.736,-28.066,-17.799,-15.966,-30.314,-30.612,-28.739,-26.562,-37.448,-30.395,-31.620,-30.653,-35.657,-35.082,-32.402,-23.225,-20.541,-27.137,-27.581,-20.363,-15.370, -9.047,-13.098,-19.483,-22.105,-24.535,-27.405,-20.412,-27.665,-34.875,-27.809,-12.074,-12.030, -7.687,-18.598,-22.058,-18.032,-14.325,-16.772,-27.289,-30.027,-30.695,-17.485, -6.638, -4.012, -4.338,-16.817,-25.702,-16.411, -6.457, -8.390,-15.019,-16.730,-21.678,-24.381,-20.268,-23.672,-28.120,-23.253,-22.962,-23.472,-20.819,-10.142,-12.744, -7.536,-13.061,-16.410,-14.538,-16.495,-17.597, -5.977, -6.942,-14.291,-13.384,-10.678, -9.944, -3.868, -4.291, -5.883,-10.807,-13.865,-10.203,-10.232, -8.353, -7.072, -6.741, -9.732, -5.083, -0.242,  0.531, -2.125, -1.438, -5.484,-10.846,-10.056, -6.406, -2.230, -6.000, -2.812, -8.739,  0.877, -0.931,  1.803, -3.508,  4.296, -0.686, -4.525, -5.401, -5.391, -8.625, -3.297, -6.553,-11.815, -0.078, -6.376, -5.001, -8.953, -3.775,  1.914, -5.867,  1.282, -0.075, -3.043, -7.725,  1.541,  4.509,  8.000,  3.514,  1.337, -1.446,  3.135,  5.772,  7.247, 10.747, -2.825, -4.904,  2.247,  2.591,  7.666, 12.469,  6.981,  2.159,  2.466, -1.328,  5.207,  0.230,  2.212,  3.074,  2.485,  4.591, -1.812, -1.207,  6.503,  7.902,  9.697,  6.335, 10.121, 12.821, 14.205, 16.451, 17.426, 18.129, 19.003,  7.790,  5.558,  4.897,  2.913, 11.097, 13.621, 11.653,  6.073,  3.621,  2.826,  3.691,  6.858,  6.355,  7.218,  4.035, 11.037, 16.426,  7.379,  7.798,  2.152,  9.713, 10.067,  7.850, 10.742, 14.934, 14.416, 17.109, 11.281,  7.965,  7.159,  5.877,  1.350,  9.441,  7.007,  1.920,  5.709,  9.268, 11.592, 14.743, 10.889,  7.756,  4.651, 11.616, 12.758, 14.548, 13.868, 14.439, 17.980, 19.241, 18.980, 16.637, 16.026, 13.653, 19.450, 15.628, 14.094, 14.203, 15.334, 13.058, 14.648, 19.828, 13.273, 10.660, 10.535,  7.515,  7.523,  7.526,  7.463,  6.877, -0.816,  9.064, 14.790,  8.635,  7.629,  9.563,  9.232,  6.799,  6.896,  6.021, 12.297,  9.322,  6.519,  5.212,  5.473,  5.468, -0.373,  2.856,  9.219,  6.962,  9.938, 14.598,  5.644,  4.245,  4.071,  7.678,  8.183,  9.810,  7.294,  3.216, -4.113, -0.795,  6.054,  0.734,  5.371,  9.599,  5.164,  6.223,  8.716, 12.542,  9.827,  1.811,  5.846,  2.086,  5.630,  2.856,  2.663,  0.829, -1.712, -2.546, -5.369, -1.831, -1.569, -4.802, -4.927,  2.679,  2.748, -0.211, -1.146, -0.837,  0.201,  1.203,  3.502,  0.187,  0.232, -3.500, -0.372,  3.960, -1.986, -0.045,  3.505,  6.295, -1.323, -2.926, -3.828, -3.064, -2.467, -0.378, -2.986, -0.525, -2.876, -0.901, -2.178, -2.645, -1.914, -0.202, -2.947, -3.679, -9.595,-10.195,-11.960,-14.866,-18.468, -8.816,-12.269,-10.679, -3.926, -6.620, -7.220, -4.436, -1.628, -1.672, -4.117, -6.029, -9.123,-13.035, -9.858,-12.132,-12.083, -8.288, -4.984, -8.942,-14.480,-15.078,-17.932,-21.336,-22.250,-21.339,-27.962,-20.281, -7.984, -9.580,-12.259,-19.965,-26.692,-29.682,-22.617,-13.118,-13.650)

bad_ci <- climdexInput.raw(tmax=tx_vals,                                 tmin=tn_vals,                                 prec=NULL,                                 tmax.dates = bad_dates,                                 tmin.dates = bad_dates,                                 prec.dates=NULL,                                 base.range = c(1950, 1950),                                 n = 5,                                 northern.hemisphere = T,                                 tavg = NULL, quantiles=NULL)

good_ci <- climdexInput.raw(tmax=tx_vals,                                  tmin=tn_vals,                                  prec=NULL,                                  tmax.dates = good_dates,                                  tmin.dates =good_dates,                                  prec.dates=NULL,                                  base.range = c(1950, 1950),                                  n = 5,                                  northern.hemisphere = T,                                  tavg = NULL, quantiles=NULL)

bad_ci@data$tmin[360:365]

-19.965 -26.692 -29.682 -22.617 -13.118      NA

good_ci@data$tmin[360:365]

-19.965 -26.692 -29.682 -22.617 -13.118 -13.650

This technically occurs for all calculations, but it's most likely to register a difference in calculation for tnn (at least in the northern hemisphere).