static void import_ts_check (DATASET *dset) { PRN *prn = gretl_print_new(GRETL_PRINT_STDERR, NULL); int reversed = 0; int mpd = -1; mpd = test_markers_for_dates(dset, &reversed, NULL, prn); if (mpd > 0) { pputs(prn, _("taking date information from row labels\n\n")); if (dset->markers != DAILY_DATE_STRINGS) { dataset_destroy_obs_markers(dset); } if (reversed) { reverse_data(dset, prn); } } #if ODEBUG fprintf(stderr, "xinfo->dset->pd = %d\n", xinfo->dset->pd); #endif if (dset->pd != 1 || strcmp(dset->stobs, "1")) { dset->structure = TIME_SERIES; } gretl_print_destroy(prn); }
static int importer_dates_check (char **labels, BookFlag *pflags, DATASET *newset, PRN *prn, int *err) { int d, t; char dstr[12]; char *s; int ret = 0; for (t=0; t<newset->n; t++) { s = labels[t]; if (s == NULL || *s == '\0') { fprintf(stderr, "importer_dates_check: got blank label\n"); return 0; } } *err = dataset_allocate_obs_markers(newset); if (*err) { return 0; } for (t=0; t<newset->n && !*err; t++) { s = labels[t]; if (*s == '"' || *s == '\'') s++; if (*pflags & BOOK_NUMERIC_DATES) { if (sscanf(s, "%d", &d)) { MS_excel_date_string(dstr, d, 0, *pflags & BOOK_DATE_BASE_1904); s = dstr; } else { pprintf(prn, "Bad date on row %d: '%s'\n", t+1, s); *err = E_DATA; } } strncat(newset->S[t], s, OBSLEN - 1); } if (!*err) { int reversed = 0; ret = test_markers_for_dates(newset, &reversed, NULL, prn); if (reversed) { *pflags |= BOOK_DATA_REVERSED; } } if (newset->markers != DAILY_DATE_STRINGS) { dataset_destroy_obs_markers(newset); } return ret; }
static int dwiz_make_changes (DATASET *dwinfo, dw_opts *opts, GtkWidget *dlg) { gchar *setobs_cmd = NULL; gretlopt opt = OPT_NONE; int create = (opts->flags & DW_CREATE); int delmiss = (opts->flags & DW_DROPMISS); int delete_markers = 0; int err = 0; #if DWDEBUG fprintf(stderr, "dwiz_make_changes: create = %d\n", create); #endif /* preliminaries */ if (time_series(dwinfo)) { ntodate(dwinfo->stobs, dwinfo->t1, dwinfo); } else if (known_panel(dwinfo)) { if (!dataset_is_panel(dataset)) { /* Turning a subset of a non-panel dataset into a panel: this change will be irreversible */ maybe_unrestrict_dataset(); } } /* special: reorganizing dataset based on panel index vars */ if (dwinfo->structure == PANEL_UNKNOWN) { int uv, tv; err = translate_panel_vars(opts, &uv, &tv); if (!err) { err = set_panel_structure_from_vars(uv, tv, dataset); } if (!err) { setobs_cmd = g_strdup_printf("setobs %s %s --panel-vars", dataset->varname[uv], dataset->varname[tv]); } goto finalize; } /* check for nothing to be done */ if (dwinfo->structure == dataset->structure && dwinfo->pd == dataset->pd && strcmp(dwinfo->stobs, dataset->stobs) == 0) { if (create || delmiss) { /* recording? */ goto finalize; } else { infobox(_("No changes were made")); return 0; } } /* if converting to time series, we probably don't want to retain any original observation-marker strings */ if (dwinfo->structure == TIME_SERIES && dataset->markers && !delmiss) { delete_markers = 1; } /* handle panel structure */ if (known_panel(dwinfo)) { int nunits = dwinfo->t1; int nperiods = dataset->n / nunits; /* we don't offer a choice of "starting obs" */ dwinfo->pd = (dwinfo->structure == STACKED_TIME_SERIES)? nperiods : nunits; strcpy(dwinfo->stobs, "1.1"); } /* handle conversion to cross-section */ if (dwinfo->structure == CROSS_SECTION) { strcpy(dwinfo->stobs, "1"); } if (dwinfo->structure == TIME_SERIES) { opt = OPT_T; } else if (dwinfo->structure == STACKED_TIME_SERIES) { opt = OPT_S; } else if (dwinfo->structure == STACKED_CROSS_SECTION) { opt = OPT_C; } else if (dwinfo->structure == CROSS_SECTION) { opt = OPT_X; } else if (dwinfo->structure == SPECIAL_TIME_SERIES) { opt = OPT_N; } err = simple_set_obs(dataset, dwinfo->pd, dwinfo->stobs, opt); #if DWDEBUG fprintf(stderr, "pd=%d, stobs='%s', opt=%d; set_obs returned %d\n", dwinfo->pd, dwinfo->stobs, opt, err); #endif if (!err && setobs_cmd == NULL) { setobs_cmd = g_strdup_printf("setobs %d %s%s", dwinfo->pd, dwinfo->stobs, print_flags(opt, SETOBS)); } finalize: if (!err && delmiss) { err = dataset_purge_missing_rows(dataset); } if (err) { gui_errmsg(err); } else if (create) { if (opts->flags & DW_SSHEET) { gtk_widget_hide(dlg); maybe_start_editing(); } else { register_data(NULLDATA_STARTED); lib_command_sprintf("nulldata %d", dataset->n); record_command_verbatim(); } } else { if (delete_markers) { dataset_destroy_obs_markers(dataset); } mark_dataset_as_modified(); } if (!err && setobs_cmd != NULL) { lib_command_strcpy(setobs_cmd); record_command_verbatim(); } g_free(setobs_cmd); #if DWDEBUG fprintf(stderr, "dwiz_make_changes: returning %d\n", err); #endif return err; }
int set_obs (const char *line, DATASET *dset, gretlopt opt) { char pdstr[VNAMELEN]; char stobs[OBSLEN]; int structure = STRUCTURE_UNKNOWN; double sd0 = dset->sd0; int pd, dated = 0; int panel = 0; int err = 0; if (dset == NULL) { return E_NODATA; } if ((opt & (OPT_R | OPT_P)) && dset->Z == NULL) { return E_NODATA; } if ((opt & (OPT_G | OPT_I)) && !dataset_is_panel(dset)) { return E_DATA; } gretl_error_clear(); if (opt & OPT_R) { /* restructure panel: "hidden" option */ return switch_panel_orientation(dset); } if (!strcmp(line, "setobs")) { /* we'll just print current obs info */ return 0; } if (opt & OPT_P) { return set_panel_structure_from_line(line, dset); } else if (opt & OPT_G) { /* --panel-groups */ return set_panel_group_strings(line, dset); } /* now we get down to business */ if (sscanf(line, "%*s %15s %10s", pdstr, stobs) != 2) { gretl_errmsg_set(_("Failed to parse line as frequency, startobs")); return E_PARSE; } pd = gretl_int_from_string(pdstr, &err); if (!err && pd < 1) { gretl_errmsg_sprintf(_("frequency (%d) does not make seem to make sense"), pd); err = E_DATA; } if (err) { return err; } /* if an explicit structure option was passed in, respect it */ if (opt == OPT_X) { structure = CROSS_SECTION; } else if (opt == OPT_T) { structure = TIME_SERIES; } else if (opt == OPT_S) { structure = STACKED_TIME_SERIES; panel = 1; } else if (opt == OPT_C) { structure = STACKED_CROSS_SECTION; panel = 1; } else if (opt == OPT_N) { structure = SPECIAL_TIME_SERIES; } else if (opt == OPT_I) { /* --panel-time */ structure = TIME_SERIES; } if (panel && dset->n > 0 && pd > dset->n) { gretl_errmsg_sprintf(_("frequency (%d) does not make seem to make sense"), pd); return 1; } err = process_starting_obs(stobs, pd, &structure, &sd0, &dated); if (err) { return err; } if (opt == OPT_I) { dset->panel_pd = pd; dset->panel_sd0 = sd0; return 0; } if (panel && dset->n % pd != 0) { int sts = structure == STACKED_TIME_SERIES; gretl_errmsg_sprintf(_("Panel datasets must be balanced.\n" "The number of observations (%d) is not a multiple\n" "of the number of %s (%d)."), dset->n, sts ? _("periods") : _("units"), pd); return E_DATA; } if (dated) { /* replace any existing markers with date strings */ dataset_destroy_obs_markers(dset); } else if (structure == TIME_SERIES && (pd == 1 || pd == 4 || pd == 12)) { /* force use of regular time-series obs labels */ dataset_destroy_obs_markers(dset); } dset->pd = pd; dset->structure = structure; dset->sd0 = sd0; ntodate(dset->stobs, 0, dset); ntodate(dset->endobs, dset->n - 1, dset); /* pre-process stacked cross-sectional panels: put into canonical stacked time series form */ if (dset->structure == STACKED_CROSS_SECTION) { if (dset->Z == NULL) { err = E_NODATA; } else { err = switch_panel_orientation(dset); } } return err; }