void get_asfreq_info(int fromFreq, int toFreq, asfreq_info *af_info) { int fromGroup = get_freq_group(fromFreq); int toGroup = get_freq_group(toFreq); af_info->sourceFreq = fromFreq; af_info->targetFreq = toFreq; switch(fromGroup) { case FR_WK: af_info->from_week_end = calc_week_end(fromFreq, fromGroup); break; case FR_ANN: af_info->from_a_year_end = calc_a_year_end(fromFreq, fromGroup); break; case FR_QTR: af_info->from_q_year_end = calc_a_year_end(fromFreq, fromGroup); break; } switch(toGroup) { case FR_WK: af_info->to_week_end = calc_week_end(toFreq, toGroup); break; case FR_ANN: af_info->to_a_year_end = calc_a_year_end(toFreq, toGroup); break; case FR_QTR: af_info->to_q_year_end = calc_a_year_end(toFreq, toGroup); break; } }
static void get_asfreq_info(int fromFreq, int toFreq, asfreq_info *af_info) { int fromGroup = get_freq_group(fromFreq); int toGroup = get_freq_group(toFreq); switch(fromGroup) { case FR_WK: { af_info->from_week_end = calc_week_end(fromFreq, fromGroup); } break; case FR_ANN: { af_info->from_a_year_end = calc_a_year_end(fromFreq, fromGroup); } break; case FR_QTR: { af_info->from_q_year_end = calc_a_year_end(fromFreq, fromGroup); } break; } switch(toGroup) { case FR_WK: { af_info->to_week_end = calc_week_end(toFreq, toGroup); } break; case FR_ANN: { af_info->to_a_year_end = calc_a_year_end(toFreq, toGroup); } break; case FR_QTR: { af_info->to_q_year_end = calc_a_year_end(toFreq, toGroup); } break; } }
freq_conv_func get_asfreq_func(int fromFreq, int toFreq) { int fromGroup = get_freq_group(fromFreq); int toGroup = get_freq_group(toFreq); if (fromGroup == FR_UND) { fromGroup = FR_DAY; } switch(fromGroup) { case FR_ANN: switch(toGroup) { case FR_ANN: return &asfreq_AtoA; case FR_QTR: return &asfreq_AtoQ; case FR_MTH: return &asfreq_AtoM; case FR_WK: return &asfreq_AtoW; case FR_BUS: return &asfreq_AtoB; case FR_DAY: case FR_HR: case FR_MIN: case FR_SEC: case FR_MS: case FR_US: case FR_NS: return &asfreq_AtoDT; default: return &nofunc; } case FR_QTR: switch(toGroup) { case FR_ANN: return &asfreq_QtoA; case FR_QTR: return &asfreq_QtoQ; case FR_MTH: return &asfreq_QtoM; case FR_WK: return &asfreq_QtoW; case FR_BUS: return &asfreq_QtoB; case FR_DAY: case FR_HR: case FR_MIN: case FR_SEC: case FR_MS: case FR_US: case FR_NS: return &asfreq_QtoDT; default: return &nofunc; } case FR_MTH: switch(toGroup) { case FR_ANN: return &asfreq_MtoA; case FR_QTR: return &asfreq_MtoQ; case FR_MTH: return &no_op; case FR_WK: return &asfreq_MtoW; case FR_BUS: return &asfreq_MtoB; case FR_DAY: case FR_HR: case FR_MIN: case FR_SEC: case FR_MS: case FR_US: case FR_NS: return &asfreq_MtoDT; default: return &nofunc; } case FR_WK: switch(toGroup) { case FR_ANN: return &asfreq_WtoA; case FR_QTR: return &asfreq_WtoQ; case FR_MTH: return &asfreq_WtoM; case FR_WK: return &asfreq_WtoW; case FR_BUS: return &asfreq_WtoB; case FR_DAY: case FR_HR: case FR_MIN: case FR_SEC: case FR_MS: case FR_US: case FR_NS: return &asfreq_WtoDT; default: return &nofunc; } case FR_BUS: switch(toGroup) { case FR_ANN: return &asfreq_BtoA; case FR_QTR: return &asfreq_BtoQ; case FR_MTH: return &asfreq_BtoM; case FR_WK: return &asfreq_BtoW; case FR_BUS: return &no_op; case FR_DAY: case FR_HR: case FR_MIN: case FR_SEC: case FR_MS: case FR_US: case FR_NS: return &asfreq_BtoDT; default: return &nofunc; } case FR_DAY: case FR_HR: case FR_MIN: case FR_SEC: case FR_MS: case FR_US: case FR_NS: switch(toGroup) { case FR_ANN: return &asfreq_DTtoA; case FR_QTR: return &asfreq_DTtoQ; case FR_MTH: return &asfreq_DTtoM; case FR_WK: return &asfreq_DTtoW; case FR_BUS: return &asfreq_DTtoB; case FR_DAY: case FR_HR: case FR_MIN: case FR_SEC: case FR_MS: case FR_US: case FR_NS: return &asfreq_WithinDT; default: return &nofunc; } default: return &nofunc; } }
/* generate an ordinal in period space */ npy_int64 get_period_ordinal(int year, int month, int day, int hour, int minute, int second, int microseconds, int picoseconds, int freq) { npy_int64 absdays, delta, seconds; npy_int64 weeks, days; npy_int64 ordinal, day_adj; int freq_group, fmonth, mdiff; freq_group = get_freq_group(freq); if (freq == FR_SEC || freq == FR_MS || freq == FR_US || freq == FR_NS) { absdays = absdate_from_ymd(year, month, day); delta = (absdays - ORD_OFFSET); seconds = (npy_int64)(delta * 86400 + hour * 3600 + minute * 60 + second); switch(freq) { case FR_MS: return seconds * 1000 + microseconds / 1000; case FR_US: return seconds * 1000000 + microseconds; case FR_NS: return seconds * 1000000000 + microseconds * 1000 + picoseconds / 1000; } return seconds; } if (freq == FR_MIN) { absdays = absdate_from_ymd(year, month, day); delta = (absdays - ORD_OFFSET); return (npy_int64)(delta*1440 + hour*60 + minute); } if (freq == FR_HR) { if ((absdays = absdate_from_ymd(year, month, day)) == INT_ERR_CODE) { goto onError; } delta = (absdays - ORD_OFFSET); return (npy_int64)(delta*24 + hour); } if (freq == FR_DAY) { return (npy_int64) (absdate_from_ymd(year, month, day) - ORD_OFFSET); } if (freq == FR_UND) { return (npy_int64) (absdate_from_ymd(year, month, day) - ORD_OFFSET); } if (freq == FR_BUS) { if((days = absdate_from_ymd(year, month, day)) == INT_ERR_CODE) { goto onError; } weeks = days / 7; return (npy_int64)(days - weeks * 2) - BDAY_OFFSET; } if (freq_group == FR_WK) { if((ordinal = (npy_int64)absdate_from_ymd(year, month, day)) == INT_ERR_CODE) { goto onError; } day_adj = freq - FR_WK; return (ordinal - (1 + day_adj)) / 7 + 1 - WEEK_OFFSET; } if (freq == FR_MTH) { return (year - BASE_YEAR) * 12 + month - 1; } if (freq_group == FR_QTR) { fmonth = freq - FR_QTR; if (fmonth == 0) fmonth = 12; mdiff = month - fmonth; if (mdiff < 0) mdiff += 12; if (month >= fmonth) mdiff += 12; return (year - BASE_YEAR) * 4 + (mdiff - 1) / 3; } if (freq_group == FR_ANN) { fmonth = freq - FR_ANN; if (fmonth == 0) fmonth = 12; if (month <= fmonth) { return year - BASE_YEAR; } else { return year - BASE_YEAR + 1; } } Py_Error(PyExc_RuntimeError, "Unable to generate frequency ordinal"); onError: return INT_ERR_CODE; }
/* generate an ordinal in period space */ long_t get_period_ordinal(int year, int month, int day, int hour, int minute, int second, int freq) { int freq_group = get_freq_group(freq); int quarter=((month-1)/3)+1; if (freq == FR_SEC) { long_t absdays, delta; absdays = absdate_from_ymd(year, month, day); delta = (absdays - HIGHFREQ_ORIG); return (long_t)(delta*86400 + hour*3600 + minute*60 + second + 1); } if (freq == FR_MIN) { long_t absdays, delta; absdays = absdate_from_ymd(year, month, day); delta = (absdays - HIGHFREQ_ORIG); return (long_t)(delta*1440 + hour*60 + minute + 1); } if (freq == FR_HR) { long_t absdays, delta; if ((absdays = absdate_from_ymd(year, month, day)) == INT_ERR_CODE) { goto onError; } delta = (absdays - HIGHFREQ_ORIG); return (long_t)(delta*24 + hour + 1); } if (freq == FR_DAY) { return (long_t)absdate_from_ymd(year, month, day); } if (freq == FR_UND) { return (long_t)absdate_from_ymd(year, month, day); } if (freq == FR_BUS) { long_t weeks, days; if((days = absdate_from_ymd(year, month, day)) == INT_ERR_CODE) { goto onError; } weeks = days/7; return (long_t)(days - weeks*2); } if (freq_group == FR_WK) { long_t adj_ordinal, ordinal, day_adj; if((ordinal = (long_t)absdate_from_ymd(year, month, day)) == INT_ERR_CODE) { goto onError; } day_adj = (7 - (freq - FR_WK)) % 7; adj_ordinal = ordinal + ((7 - day_adj) - ordinal % 7) % 7; return adj_ordinal/7; } if (freq == FR_MTH) { return (year-1)*12 + month; } if (freq_group == FR_QTR) { return (year-1)*4 + quarter; } if (freq_group == FR_ANN) { return year; } Py_Error(PyExc_RuntimeError, "Unable to generate frequency ordinal"); onError: return INT_ERR_CODE; }
static freq_conv_func get_asfreq_func(int fromFreq, int toFreq, int forConvert) { int fromGroup = get_freq_group(fromFreq); int toGroup = get_freq_group(toFreq); if (fromGroup == FR_UND) { fromGroup = FR_DAY; } switch(fromGroup) { case FR_ANN: switch(toGroup) { case FR_ANN: return &asfreq_AtoA; case FR_QTR: return &asfreq_AtoQ; case FR_MTH: return &asfreq_AtoM; case FR_WK: return &asfreq_AtoW; case FR_BUS: return &asfreq_AtoB; case FR_DAY: return &asfreq_AtoD; case FR_HR: return &asfreq_AtoH; case FR_MIN: return &asfreq_AtoT; case FR_SEC: return &asfreq_AtoS; default: return &nofunc; } case FR_QTR: switch(toGroup) { case FR_ANN: return &asfreq_QtoA; case FR_QTR: return &asfreq_QtoQ; case FR_MTH: return &asfreq_QtoM; case FR_WK: return &asfreq_QtoW; case FR_BUS: return &asfreq_QtoB; case FR_DAY: return &asfreq_QtoD; case FR_HR: return &asfreq_QtoH; case FR_MIN: return &asfreq_QtoT; case FR_SEC: return &asfreq_QtoS; default: return &nofunc; } case FR_MTH: switch(toGroup) { case FR_ANN: return &asfreq_MtoA; case FR_QTR: return &asfreq_MtoQ; case FR_MTH: return &no_op; case FR_WK: return &asfreq_MtoW; case FR_BUS: return &asfreq_MtoB; case FR_DAY: return &asfreq_MtoD; case FR_HR: return &asfreq_MtoH; case FR_MIN: return &asfreq_MtoT; case FR_SEC: return &asfreq_MtoS; default: return &nofunc; } case FR_WK: switch(toGroup) { case FR_ANN: return &asfreq_WtoA; case FR_QTR: return &asfreq_WtoQ; case FR_MTH: return &asfreq_WtoM; case FR_WK: return &asfreq_WtoW; case FR_BUS: return &asfreq_WtoB; case FR_DAY: return &asfreq_WtoD; case FR_HR: return &asfreq_WtoH; case FR_MIN: return &asfreq_WtoT; case FR_SEC: return &asfreq_WtoS; default: return &nofunc; } case FR_BUS: switch(toGroup) { case FR_ANN: return &asfreq_BtoA; case FR_QTR: return &asfreq_BtoQ; case FR_MTH: return &asfreq_BtoM; case FR_WK: return &asfreq_BtoW; case FR_DAY: return &asfreq_BtoD; case FR_BUS: return &no_op; case FR_HR: return &asfreq_BtoH; case FR_MIN: return &asfreq_BtoT; case FR_SEC: return &asfreq_BtoS; default: return &nofunc; } case FR_DAY: switch(toGroup) { case FR_ANN: return &asfreq_DtoA; case FR_QTR: return &asfreq_DtoQ; case FR_MTH: return &asfreq_DtoM; case FR_WK: return &asfreq_DtoW; case FR_BUS: if (forConvert) { return &asfreq_DtoB_forConvert; } else { return &asfreq_DtoB; } case FR_DAY: return &asfreq_DtoD; case FR_HR: return &asfreq_DtoH; case FR_MIN: return &asfreq_DtoT; case FR_SEC: return &asfreq_DtoS; default: return &nofunc; } case FR_HR: switch(toGroup) { case FR_ANN: return &asfreq_HtoA; case FR_QTR: return &asfreq_HtoQ; case FR_MTH: return &asfreq_HtoM; case FR_WK: return &asfreq_HtoW; case FR_BUS: if (forConvert) { return &asfreq_HtoB_forConvert; } else { return &asfreq_HtoB; } case FR_DAY: return &asfreq_HtoD; case FR_HR: return &no_op; case FR_MIN: return &asfreq_HtoT; case FR_SEC: return &asfreq_HtoS; default: return &nofunc; } case FR_MIN: switch(toGroup) { case FR_ANN: return &asfreq_TtoA; case FR_QTR: return &asfreq_TtoQ; case FR_MTH: return &asfreq_TtoM; case FR_WK: return &asfreq_TtoW; case FR_BUS: if (forConvert) { return &asfreq_TtoB_forConvert; } else { return &asfreq_TtoB; } case FR_DAY: return &asfreq_TtoD; case FR_HR: return &asfreq_TtoH; case FR_MIN: return &no_op; case FR_SEC: return &asfreq_TtoS; default: return &nofunc; } case FR_SEC: switch(toGroup) { case FR_ANN: return &asfreq_StoA; case FR_QTR: return &asfreq_StoQ; case FR_MTH: return &asfreq_StoM; case FR_WK: return &asfreq_StoW; case FR_BUS: if (forConvert) { return &asfreq_StoB_forConvert; } else { return &asfreq_StoB; } case FR_DAY: return &asfreq_StoD; case FR_HR: return &asfreq_StoH; case FR_MIN: return &asfreq_StoT; case FR_SEC: return &no_op; default: return &nofunc; } default: return &nofunc; } }
/* generate an ordinal in period space */ int64_t get_period_ordinal(int year, int month, int day, int hour, int minute, int second, int freq) { int64_t absdays, delta; int64_t weeks, days; int64_t adj_ordinal, ordinal, day_adj; int freq_group, fmonth, mdiff, quarter; freq_group = get_freq_group(freq); if (freq == FR_SEC) { absdays = absdate_from_ymd(year, month, day); delta = (absdays - HIGHFREQ_ORIG); return (int64_t)(delta*86400 + hour*3600 + minute*60 + second + 1); } if (freq == FR_MIN) { absdays = absdate_from_ymd(year, month, day); delta = (absdays - HIGHFREQ_ORIG); return (int64_t)(delta*1440 + hour*60 + minute + 1); } if (freq == FR_HR) { if ((absdays = absdate_from_ymd(year, month, day)) == INT_ERR_CODE) { goto onError; } delta = (absdays - HIGHFREQ_ORIG); return (int64_t)(delta*24 + hour + 1); } if (freq == FR_DAY) { return (int64_t)absdate_from_ymd(year, month, day); } if (freq == FR_UND) { return (int64_t)absdate_from_ymd(year, month, day); } if (freq == FR_BUS) { if((days = absdate_from_ymd(year, month, day)) == INT_ERR_CODE) { goto onError; } weeks = days/7; return (int64_t)(days - weeks*2); } if (freq_group == FR_WK) { if((ordinal = (int64_t)absdate_from_ymd(year, month, day)) == INT_ERR_CODE) { goto onError; } day_adj = (7 - (freq - FR_WK)) % 7; adj_ordinal = ordinal + ((7 - day_adj) - ordinal % 7) % 7; return adj_ordinal/7; } if (freq == FR_MTH) { return (year-1)*12 + month; } if (freq_group == FR_QTR) { fmonth = freq - FR_QTR; if (fmonth == 0) fmonth = 12; mdiff = month - fmonth; if (mdiff < 0) mdiff += 12; if (month >= fmonth) mdiff += 12; return 1 + (year - 1) * 4 + (mdiff - 1) / 3; } if (freq_group == FR_ANN) { fmonth = freq - FR_ANN; if (fmonth == 0) fmonth = 12; if (month <= fmonth) { return year; } else { return year + 1; } } Py_Error(PyExc_RuntimeError, "Unable to generate frequency ordinal"); onError: return INT_ERR_CODE; }