static void maybe_fix_daily_start (long *ed, int pd) { int wday = weekday_from_epoch_day(*ed); int fix = 0; if (wday == 0) { /* 5- or 6-day data: sunday not valid */ fix = 1; } else if (wday == 6 && pd == 5) { /* 5-day data: saturday not valid */ fix = 2; } if (fix) { char *fixed, *msg; *ed += fix; fixed = ymd_extended_from_epoch_day(*ed, NULL); msg = gretl_strdup_printf("the starting date was corrected to Monday %s", fixed); gretl_warnmsg_set(msg); free(msg); free(fixed); } }
DATASET *midas_aux_dataset (const int *list, const DATASET *dset, int *err) { DATASET *mset = NULL; gretlopt opt = 0; int mpd, pd = dset->pd; int T, m = list[0]; int yr, mon; int daily = 0; if (m < 3 || gretl_list_has_separator(list)) { *err = E_INVARG; } else if (!dataset_is_time_series(dset)) { *err = E_INVARG; } else if (pd != 1 && pd != 4 && pd != 12) { /* host dataset should be annual, quarterly or monthly */ *err = E_PDWRONG; } if (*err) { return NULL; } if (pd == 1) { /* annual: midas series should be quarterly or monthly */ if (m != 4 && m != 12) { *err = E_INVARG; } else { mpd = m; } } else if (pd == 4) { /* quarterly: midas series should be monthly or daily */ if (m == 3) { mpd = 12; } else if (m == midas_days_per_period(5, 4)) { mpd = 5; } else if (m == midas_days_per_period(6, 4)) { mpd = 6; } else if (m == midas_days_per_period(7, 4)) { mpd = 7; } else { *err = E_INVARG; } } else { /* monthly: midas series should be daily */ if (m == midas_days_per_period(5, 12)) { mpd = 5; } else if (m == midas_days_per_period(6, 12)) { mpd = 6; } else if (m == midas_days_per_period(7, 12)) { mpd = 7; } else { *err = E_INVARG; } } if (*err) { return NULL; } if (!gretl_is_midas_list(list, dset)) { gretl_warnmsg_set("The argument does not seem to be a MIDAS list"); } T = sample_size(dset) * m; if (mpd >= 5 && mpd <= 7) { /* we'll add markers for daily dates */ daily = 1; opt = OPT_M; } mset = create_auxiliary_dataset(1, T, opt); if (mset == NULL) { *err = E_ALLOC; } if (!*err) { char *p, obs[OBSLEN]; int nonex, qtr = 0; int i, t, s, m3 = 0; mset->pd = mpd; mset->structure = TIME_SERIES; strcpy(mset->varname[0], dset->varname[list[1]]); p = strrchr(mset->varname[0], '_'); if (p != NULL) *p = '\0'; ntodate(obs, dset->t1, dset); if (mpd == 4) { sprintf(mset->stobs, "%d:1", atoi(obs)); } else if (mpd == 12) { sprintf(mset->stobs, "%d:01", atoi(obs)); } if (daily && pd == 4) { m3 = m / 3; } /* loop across observations in low-frequency dataset */ s = 0; for (t=dset->t1; t<=dset->t2; t++) { if (daily) { ntodate(obs, t, dset); sscanf(obs, "%d:%d", &yr, &mon); if (pd == 4) { qtr = mon; } } /* read data right-to-left! */ for (i=m; i>0; i--) { int vi = list[i]; if (daily) { if (pd == 4) { mon = quarter_to_month(qtr, m, m-i+1); nonex = daily_index_to_date(mset->S[s], yr, mon, (m-i) % m3, mpd); } else { nonex = daily_index_to_date(mset->S[s], yr, mon, m-i, mpd); } if (nonex) { /* skip any non-existent daily dates */ mset->t2 -= 1; } else { mset->Z[0][s++] = dset->Z[vi][t]; } } else { mset->Z[0][s++] = dset->Z[vi][t]; } } } if (daily) { strcpy(mset->stobs, mset->S[0]); strcpy(mset->endobs, mset->S[mset->t2]); mset->markers = DAILY_DATE_STRINGS; } mset->sd0 = get_date_x(mset->pd, mset->stobs); if (!daily) { ntodate(mset->endobs, mset->t2, mset); } } return mset; }