[Scipy-svn] r2823 - trunk/Lib/sandbox/timeseries/src
scipy-svn at scipy.org
scipy-svn at scipy.org
Mon Mar 5 16:58:57 EST 2007
Author: mattknox_ca
Date: 2007-03-05 15:58:53 -0600 (Mon, 05 Mar 2007)
New Revision: 2823
Modified:
trunk/Lib/sandbox/timeseries/src/cseries.c
Log:
added support for different weekly frequencies (weekly-saturday, weekly-Monday, etc)
Modified: trunk/Lib/sandbox/timeseries/src/cseries.c
===================================================================
--- trunk/Lib/sandbox/timeseries/src/cseries.c 2007-03-05 21:57:47 UTC (rev 2822)
+++ trunk/Lib/sandbox/timeseries/src/cseries.c 2007-03-05 21:58:53 UTC (rev 2823)
@@ -11,13 +11,22 @@
#define FR_ANN 1000 /* Annual */
#define FR_QTR 2000 /* Quarterly */
#define FR_MTH 3000 /* Monthly */
+
#define FR_WK 4000 /* Weekly */
+#define FR_WKSUN FR_WK /* Weekly - Sunday end of week */
+#define FR_WKMON 4001 /* Weekly - Monday end of week */
+#define FR_WKTUE 4002 /* Weekly - Tuesday end of week */
+#define FR_WKWED 4003 /* Weekly - Wednesday end of week */
+#define FR_WKTHU 4004 /* Weekly - Thursday end of week */
+#define FR_WKFRI 4005 /* Weekly - Friday end of week */
+#define FR_WKSAT 4006 /* Weekly - Saturday end of week */
+
#define FR_BUS 5000 /* Business days */
#define FR_DAY 6000 /* Daily */
#define FR_HR 7000 /* Hourly */
#define FR_MIN 8000 /* Minutely */
#define FR_SEC 9000 /* Secondly */
-#define FR_UND -9999 /* Undefined */
+#define FR_UND -10000 /* Undefined */
#define ADD_INT_TO_DICT(dict, key, val) \
{PyObject *pyval = PyInt_FromLong(val); \
@@ -28,6 +37,13 @@
#define CHECK_ASFREQ(result) if ((result) == DINFO_ERR) return NULL
+struct asfreq_info{
+ int to_week_end; //day the week ends on in the "to" frequency
+ int from_week_end; //day the week ends on in the "from" frequency
+};
+
+static struct asfreq_info NULL_AF_INFO;
+
//DERIVED FROM mx.DateTime
/*
=====================================================
@@ -446,7 +462,7 @@
//************ FROM DAILY ***************
-static long asfreq_DtoA(long fromDate, char relation) {
+static long asfreq_DtoA(long fromDate, char relation, struct asfreq_info af_info) {
struct date_info dinfo;
if (dInfoCalc_SetFromAbsDate(&dinfo, fromDate,
@@ -454,7 +470,7 @@
return (long)(dinfo.year);
}
-static long asfreq_DtoQ(long fromDate, char relation) {
+static long asfreq_DtoQ(long fromDate, char relation, struct asfreq_info af_info) {
struct date_info dinfo;
if (dInfoCalc_SetFromAbsDate(&dinfo, fromDate,
@@ -462,7 +478,7 @@
return (long)((dinfo.year - 1) * 4 + dinfo.quarter);
}
-static long asfreq_DtoM(long fromDate, char relation) {
+static long asfreq_DtoM(long fromDate, char relation, struct asfreq_info af_info) {
struct date_info dinfo;
if (dInfoCalc_SetFromAbsDate(&dinfo, fromDate,
@@ -470,9 +486,11 @@
return (long)((dinfo.year - 1) * 12 + dinfo.month);
}
-static long asfreq_DtoW(long fromDate, char relation) { return (fromDate - 1)/7 + 1; }
+static long asfreq_DtoW(long fromDate, char relation, struct asfreq_info af_info) {
+ return (fromDate - (1 + af_info.to_week_end))/7 + 1;
+}
-static long asfreq_DtoB(long fromDate, char relation) {
+static long asfreq_DtoB(long fromDate, char relation, struct asfreq_info af_info) {
struct date_info dinfo;
if (dInfoCalc_SetFromAbsDate(&dinfo, fromDate,
@@ -485,7 +503,7 @@
}
}
-static long asfreq_DtoB_forConvert(long fromDate, char relation) {
+static long asfreq_DtoB_forConvert(long fromDate, char relation, struct asfreq_info af_info) {
struct date_info dinfo;
if (dInfoCalc_SetFromAbsDate(&dinfo, fromDate,
@@ -499,7 +517,7 @@
}
// needed for getDateInfo function
-static long asfreq_DtoD(long fromDate, char relation) { return fromDate; }
+static long asfreq_DtoD(long fromDate, char relation, struct asfreq_info af_info) { return fromDate; }
static long asfreq_DtoHIGHFREQ(long fromDate, char relation, long periodsPerDay) {
if (fromDate >= minval_D_toHighFreq) {
@@ -508,115 +526,143 @@
} else { return -1; }
}
-static long asfreq_DtoH(long fromDate, char relation) { return asfreq_DtoHIGHFREQ(fromDate, relation, 24); }
-static long asfreq_DtoT(long fromDate, char relation) { return asfreq_DtoHIGHFREQ(fromDate, relation, 24*60); }
-static long asfreq_DtoS(long fromDate, char relation) { return asfreq_DtoHIGHFREQ(fromDate, relation, 24*60*60); }
+static long asfreq_DtoH(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoHIGHFREQ(fromDate, relation, 24); }
+static long asfreq_DtoT(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoHIGHFREQ(fromDate, relation, 24*60); }
+static long asfreq_DtoS(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoHIGHFREQ(fromDate, relation, 24*60*60); }
//************ FROM SECONDLY ***************
-static long asfreq_StoD(long fromDate, char relation) { return (fromDate - 1)/(60*60*24) + minval_D_toHighFreq; }
+static long asfreq_StoD(long fromDate, char relation, struct asfreq_info af_info)
+ { return (fromDate - 1)/(60*60*24) + minval_D_toHighFreq; }
-static long asfreq_StoA(long fromDate, char relation) { return asfreq_DtoA(asfreq_StoD(fromDate, relation), relation); }
-static long asfreq_StoQ(long fromDate, char relation) { return asfreq_DtoQ(asfreq_StoD(fromDate, relation), relation); }
-static long asfreq_StoM(long fromDate, char relation) { return asfreq_DtoM(asfreq_StoD(fromDate, relation), relation); }
-static long asfreq_StoW(long fromDate, char relation) { return asfreq_DtoW(asfreq_StoD(fromDate, relation), relation); }
-static long asfreq_StoB(long fromDate, char relation) { return asfreq_DtoB(asfreq_StoD(fromDate, relation), relation); }
-static long asfreq_StoB_forConvert(long fromDate, char relation)
- { return asfreq_DtoB_forConvert(asfreq_StoD(fromDate, relation), relation); }
-static long asfreq_StoT(long fromDate, char relation) { return (fromDate - 1)/60 + 1; }
-static long asfreq_StoH(long fromDate, char relation) { return (fromDate - 1)/(60*60) + 1; }
+static long asfreq_StoA(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoA(asfreq_StoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_StoQ(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoQ(asfreq_StoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_StoM(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoM(asfreq_StoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_StoW(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoW(asfreq_StoD(fromDate, relation, NULL_AF_INFO), relation, af_info); }
+static long asfreq_StoB(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoB(asfreq_StoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_StoB_forConvert(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoB_forConvert(asfreq_StoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_StoT(long fromDate, char relation, struct asfreq_info af_info)
+ { return (fromDate - 1)/60 + 1; }
+static long asfreq_StoH(long fromDate, char relation, struct asfreq_info af_info)
+ { return (fromDate - 1)/(60*60) + 1; }
//************ FROM MINUTELY ***************
-static long asfreq_TtoD(long fromDate, char relation) { return (fromDate - 1)/(60*24) + minval_D_toHighFreq; }
+static long asfreq_TtoD(long fromDate, char relation, struct asfreq_info af_info)
+ { return (fromDate - 1)/(60*24) + minval_D_toHighFreq; }
-static long asfreq_TtoA(long fromDate, char relation) { return asfreq_DtoA(asfreq_TtoD(fromDate, relation), relation); }
-static long asfreq_TtoQ(long fromDate, char relation) { return asfreq_DtoQ(asfreq_TtoD(fromDate, relation), relation); }
-static long asfreq_TtoM(long fromDate, char relation) { return asfreq_DtoM(asfreq_TtoD(fromDate, relation), relation); }
-static long asfreq_TtoW(long fromDate, char relation) { return asfreq_DtoW(asfreq_TtoD(fromDate, relation), relation); }
-static long asfreq_TtoB(long fromDate, char relation) { return asfreq_DtoB(asfreq_TtoD(fromDate, relation), relation); }
+static long asfreq_TtoA(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoA(asfreq_TtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_TtoQ(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoQ(asfreq_TtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_TtoM(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoM(asfreq_TtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_TtoW(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoW(asfreq_TtoD(fromDate, relation, NULL_AF_INFO), relation, af_info); }
+static long asfreq_TtoB(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoB(asfreq_TtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
-static long asfreq_TtoB_forConvert(long fromDate, char relation)
- { return asfreq_DtoB_forConvert(asfreq_TtoD(fromDate, relation), relation); }
+static long asfreq_TtoB_forConvert(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoB_forConvert(asfreq_TtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
-static long asfreq_TtoH(long fromDate, char relation) { return (fromDate - 1)/60 + 1; }
-static long asfreq_TtoS(long fromDate, char relation) {
+static long asfreq_TtoH(long fromDate, char relation, struct asfreq_info af_info)
+ { return (fromDate - 1)/60 + 1; }
+static long asfreq_TtoS(long fromDate, char relation, struct asfreq_info af_info) {
if (relation == 'B') { return fromDate*60 - 59; }
else { return fromDate*60; }}
//************ FROM HOURLY ***************
-static long asfreq_HtoD(long fromDate, char relation) { return (fromDate - 1)/24 + minval_D_toHighFreq; }
-static long asfreq_HtoA(long fromDate, char relation) { return asfreq_DtoA(asfreq_HtoD(fromDate, relation), relation); }
-static long asfreq_HtoQ(long fromDate, char relation) { return asfreq_DtoQ(asfreq_HtoD(fromDate, relation), relation); }
-static long asfreq_HtoM(long fromDate, char relation) { return asfreq_DtoM(asfreq_HtoD(fromDate, relation), relation); }
-static long asfreq_HtoW(long fromDate, char relation) { return asfreq_DtoW(asfreq_HtoD(fromDate, relation), relation); }
-static long asfreq_HtoB(long fromDate, char relation) { return asfreq_DtoB(asfreq_HtoD(fromDate, relation), relation); }
+static long asfreq_HtoD(long fromDate, char relation, struct asfreq_info af_info)
+ { return (fromDate - 1)/24 + minval_D_toHighFreq; }
+static long asfreq_HtoA(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoA(asfreq_HtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_HtoQ(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoQ(asfreq_HtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_HtoM(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoM(asfreq_HtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_HtoW(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoW(asfreq_HtoD(fromDate, relation, NULL_AF_INFO), relation, af_info); }
+static long asfreq_HtoB(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoB(asfreq_HtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
-static long asfreq_HtoB_forConvert(long fromDate, char relation)
- { return asfreq_DtoB_forConvert(asfreq_HtoD(fromDate, relation), relation); }
+static long asfreq_HtoB_forConvert(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoB_forConvert(asfreq_HtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
// calculation works out the same as TtoS, so we just call that function for HtoT
-static long asfreq_HtoT(long fromDate, char relation) { return asfreq_TtoS(fromDate, relation); }
-static long asfreq_HtoS(long fromDate, char relation) {
+static long asfreq_HtoT(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_TtoS(fromDate, relation, NULL_AF_INFO); }
+static long asfreq_HtoS(long fromDate, char relation, struct asfreq_info af_info) {
if (relation == 'B') { return fromDate*60*60 - 60*60 + 1; }
else { return fromDate*60*60; }}
//************ FROM BUSINESS ***************
-static long asfreq_BtoD(long fromDate, char relation) {
- return ((fromDate-1)/5)*7 + (fromDate-1)%5 + 1; }
+static long asfreq_BtoD(long fromDate, char relation, struct asfreq_info af_info)
+ { return ((fromDate-1)/5)*7 + (fromDate-1)%5 + 1; }
-static long asfreq_BtoA(long fromDate, char relation) {
- return asfreq_DtoA(asfreq_BtoD(fromDate, relation), relation); }
+static long asfreq_BtoA(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoA(asfreq_BtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
-static long asfreq_BtoQ(long fromDate, char relation) {
- return asfreq_DtoQ(asfreq_BtoD(fromDate, relation), relation); }
+static long asfreq_BtoQ(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoQ(asfreq_BtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
-static long asfreq_BtoM(long fromDate, char relation) {
- return asfreq_DtoM(asfreq_BtoD(fromDate, relation), relation); }
+static long asfreq_BtoM(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoM(asfreq_BtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
-static long asfreq_BtoW(long fromDate, char relation) {
- return asfreq_DtoW(asfreq_BtoD(fromDate, relation), relation); }
+static long asfreq_BtoW(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoW(asfreq_BtoD(fromDate, relation, NULL_AF_INFO), relation, af_info); }
-static long asfreq_BtoH(long fromDate, char relation) {
- return asfreq_DtoH(asfreq_BtoD(fromDate, relation), relation); }
+static long asfreq_BtoH(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoH(asfreq_BtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
-static long asfreq_BtoT(long fromDate, char relation) {
- return asfreq_DtoT(asfreq_BtoD(fromDate, relation), relation); }
+static long asfreq_BtoT(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoT(asfreq_BtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
-static long asfreq_BtoS(long fromDate, char relation) {
- return asfreq_DtoS(asfreq_BtoD(fromDate, relation), relation); }
+static long asfreq_BtoS(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoS(asfreq_BtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
//************ FROM WEEKLY ***************
-static long asfreq_WtoD(long fromDate, char relation) {
- if (relation == 'B') { return fromDate * 7 - 6;}
- else { return fromDate * 7; }}
+static long asfreq_WtoD(long fromDate, char relation, struct asfreq_info af_info) {
+ if (relation == 'B') { return fromDate * 7 - 6 + af_info.from_week_end;}
+ else { return fromDate * 7 + af_info.from_week_end; }}
-static long asfreq_WtoA(long fromDate, char relation) {
- return asfreq_DtoA(asfreq_WtoD(fromDate, 'A'), relation); }
-static long asfreq_WtoQ(long fromDate, char relation) {
- return asfreq_DtoQ(asfreq_WtoD(fromDate, 'A'), relation); }
-static long asfreq_WtoM(long fromDate, char relation) {
- return asfreq_DtoM(asfreq_WtoD(fromDate, 'A'), relation); }
+static long asfreq_WtoA(long fromDate, char relation, struct asfreq_info af_info) {
+ return asfreq_DtoA(asfreq_WtoD(fromDate, 'A', af_info), relation, NULL_AF_INFO); }
+static long asfreq_WtoQ(long fromDate, char relation, struct asfreq_info af_info) {
+ return asfreq_DtoQ(asfreq_WtoD(fromDate, 'A', af_info), relation, NULL_AF_INFO); }
+static long asfreq_WtoM(long fromDate, char relation, struct asfreq_info af_info) {
+ return asfreq_DtoM(asfreq_WtoD(fromDate, 'A', af_info), relation, NULL_AF_INFO); }
-static long asfreq_WtoB(long fromDate, char relation) {
+static long asfreq_WtoW(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoW(asfreq_WtoD(fromDate, relation, af_info), relation, NULL_AF_INFO); }
+static long asfreq_WtoB(long fromDate, char relation, struct asfreq_info af_info) {
+
struct date_info dinfo;
- if (dInfoCalc_SetFromAbsDate(&dinfo, asfreq_WtoD(fromDate, relation),
+ if (dInfoCalc_SetFromAbsDate(&dinfo, asfreq_WtoD(fromDate, relation, af_info),
GREGORIAN_CALENDAR)) return DINFO_ERR;
if (relation == 'B') { return DtoB_WeekendToMonday(dinfo); }
else { return DtoB_WeekendToFriday(dinfo); }
}
-static long asfreq_WtoH(long fromDate, char relation) {
- return asfreq_DtoH(asfreq_WtoD(fromDate, relation), relation); }
-static long asfreq_WtoT(long fromDate, char relation) {
- return asfreq_DtoT(asfreq_WtoD(fromDate, relation), relation); }
-static long asfreq_WtoS(long fromDate, char relation) {
- return asfreq_DtoS(asfreq_WtoD(fromDate, relation), relation); }
+static long asfreq_WtoH(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoH(asfreq_WtoD(fromDate, relation, af_info), relation, NULL_AF_INFO); }
+static long asfreq_WtoT(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoT(asfreq_WtoD(fromDate, relation, af_info), relation, NULL_AF_INFO); }
+static long asfreq_WtoS(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoS(asfreq_WtoD(fromDate, relation, af_info), relation, NULL_AF_INFO); }
//************ FROM MONTHLY ***************
@@ -625,7 +671,7 @@
*m = fromDate - 12 * (*y) - 1;
}
-static long asfreq_MtoD(long fromDate, char relation) {
+static long asfreq_MtoD(long fromDate, char relation, struct asfreq_info af_info) {
long y, m, absdate;
@@ -640,24 +686,30 @@
}
}
-static long asfreq_MtoA(long fromDate, char relation) { return (fromDate - 1) / 12 + 1; }
-static long asfreq_MtoQ(long fromDate, char relation) { return (fromDate - 1) / 3 + 1; }
+static long asfreq_MtoA(long fromDate, char relation, struct asfreq_info af_info)
+ { return (fromDate - 1) / 12 + 1; }
+static long asfreq_MtoQ(long fromDate, char relation, struct asfreq_info af_info)
+ { return (fromDate - 1) / 3 + 1; }
-static long asfreq_MtoW(long fromDate, char relation) { return asfreq_DtoW(asfreq_MtoD(fromDate, relation), relation); }
+static long asfreq_MtoW(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoW(asfreq_MtoD(fromDate, relation, NULL_AF_INFO), relation, af_info); }
-static long asfreq_MtoB(long fromDate, char relation) {
+static long asfreq_MtoB(long fromDate, char relation, struct asfreq_info af_info) {
struct date_info dinfo;
- if (dInfoCalc_SetFromAbsDate(&dinfo, asfreq_MtoD(fromDate, relation),
+ if (dInfoCalc_SetFromAbsDate(&dinfo, asfreq_MtoD(fromDate, relation, NULL_AF_INFO),
GREGORIAN_CALENDAR)) return DINFO_ERR;
if (relation == 'B') { return DtoB_WeekendToMonday(dinfo); }
else { return DtoB_WeekendToFriday(dinfo); }
}
-static long asfreq_MtoH(long fromDate, char relation) { return asfreq_DtoH(asfreq_MtoD(fromDate, relation), relation); }
-static long asfreq_MtoT(long fromDate, char relation) { return asfreq_DtoT(asfreq_MtoD(fromDate, relation), relation); }
-static long asfreq_MtoS(long fromDate, char relation) { return asfreq_DtoS(asfreq_MtoD(fromDate, relation), relation); }
+static long asfreq_MtoH(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoH(asfreq_MtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_MtoT(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoT(asfreq_MtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_MtoS(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoS(asfreq_MtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
//************ FROM QUARTERLY ***************
@@ -666,7 +718,7 @@
*m = (fromDate + 4) * 3 - 12 * (*y) - 2;
}
-static long asfreq_QtoD(long fromDate, char relation) {
+static long asfreq_QtoD(long fromDate, char relation, struct asfreq_info af_info) {
long y, m, absdate;
@@ -681,19 +733,21 @@
}
}
-static long asfreq_QtoA(long fromDate, char relation) { return (fromDate - 1)/ 4 + 1; }
+static long asfreq_QtoA(long fromDate, char relation, struct asfreq_info af_info)
+ { return (fromDate - 1)/ 4 + 1; }
-static long asfreq_QtoM(long fromDate, char relation) {
+static long asfreq_QtoM(long fromDate, char relation, struct asfreq_info af_info) {
if (relation == 'B') { return fromDate * 3 - 2; }
else { return fromDate * 3; }
}
-static long asfreq_QtoW(long fromDate, char relation) { return asfreq_DtoW(asfreq_QtoD(fromDate, relation), relation); }
+static long asfreq_QtoW(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoW(asfreq_QtoD(fromDate, relation, NULL_AF_INFO), relation, af_info); }
-static long asfreq_QtoB(long fromDate, char relation) {
+static long asfreq_QtoB(long fromDate, char relation, struct asfreq_info af_info) {
struct date_info dinfo;
- if (dInfoCalc_SetFromAbsDate(&dinfo, asfreq_QtoD(fromDate, relation),
+ if (dInfoCalc_SetFromAbsDate(&dinfo, asfreq_QtoD(fromDate, relation, NULL_AF_INFO),
GREGORIAN_CALENDAR)) return DINFO_ERR;
if (relation == 'B') { return DtoB_WeekendToMonday(dinfo); }
@@ -701,14 +755,17 @@
}
-static long asfreq_QtoH(long fromDate, char relation) { return asfreq_DtoH(asfreq_QtoD(fromDate, relation), relation); }
-static long asfreq_QtoT(long fromDate, char relation) { return asfreq_DtoT(asfreq_QtoD(fromDate, relation), relation); }
-static long asfreq_QtoS(long fromDate, char relation) { return asfreq_DtoS(asfreq_QtoD(fromDate, relation), relation); }
+static long asfreq_QtoH(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoH(asfreq_QtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_QtoT(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoT(asfreq_QtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_QtoS(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoS(asfreq_QtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
//************ FROM ANNUAL ***************
-static long asfreq_AtoD(long fromDate, char relation) {
+static long asfreq_AtoD(long fromDate, char relation, struct asfreq_info af_info) {
long absdate;
if (relation == 'B') {
if ((absdate = absdate_from_ymd(fromDate,1,1)) == DINFO_ERR) return DINFO_ERR;
@@ -719,19 +776,20 @@
}
}
-static long asfreq_AtoQ(long fromDate, char relation) {
+static long asfreq_AtoQ(long fromDate, char relation, struct asfreq_info af_info) {
if (relation == 'B') { return fromDate * 4 - 3; }
else { return fromDate * 4; }
}
-static long asfreq_AtoM(long fromDate, char relation) {
+static long asfreq_AtoM(long fromDate, char relation, struct asfreq_info af_info) {
if (relation == 'B') { return fromDate * 12 - 11; }
else { return fromDate * 12; }
}
-static long asfreq_AtoW(long fromDate, char relation) { return asfreq_DtoW(asfreq_AtoD(fromDate, relation), relation); }
+static long asfreq_AtoW(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoW(asfreq_AtoD(fromDate, relation, NULL_AF_INFO), relation, af_info); }
-static long asfreq_AtoB(long fromDate, char relation) {
+static long asfreq_AtoB(long fromDate, char relation, struct asfreq_info af_info) {
struct date_info dailyDate;
@@ -757,22 +815,28 @@
}
}
-static long asfreq_AtoH(long fromDate, char relation) { return asfreq_DtoH(asfreq_AtoD(fromDate, relation), relation); }
-static long asfreq_AtoT(long fromDate, char relation) { return asfreq_DtoT(asfreq_AtoD(fromDate, relation), relation); }
-static long asfreq_AtoS(long fromDate, char relation) { return asfreq_DtoS(asfreq_AtoD(fromDate, relation), relation); }
+static long asfreq_AtoH(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoH(asfreq_AtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_AtoT(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoT(asfreq_AtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
+static long asfreq_AtoS(long fromDate, char relation, struct asfreq_info af_info)
+ { return asfreq_DtoS(asfreq_AtoD(fromDate, relation, NULL_AF_INFO), relation, NULL_AF_INFO); }
-static long nofunc(long fromDate, char relation) { return -1; }
+static long nofunc(long fromDate, char relation, struct asfreq_info af_info) { return -1; }
// end of frequency specific conversion routines
// return a pointer to appropriate conversion function
-static long (*get_asfreq_func(int fromFreq, int toFreq, int forConvert))(long, char) {
+static long (*get_asfreq_func(int fromFreq, int toFreq, int forConvert))(long, char, struct asfreq_info) {
- switch(fromFreq)
+ int fromGroup = (fromFreq/1000)*1000;
+ int toGroup = (toFreq/1000)*1000;
+
+ switch(fromGroup)
{
case FR_ANN:
- switch(toFreq)
+ switch(toGroup)
{
case FR_QTR: return &asfreq_AtoQ;
case FR_MTH: return &asfreq_AtoM;
@@ -786,7 +850,7 @@
}
case FR_QTR:
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return &asfreq_QtoA;
case FR_MTH: return &asfreq_QtoM;
@@ -800,7 +864,7 @@
}
case FR_MTH:
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return &asfreq_MtoA;
case FR_QTR: return &asfreq_MtoQ;
@@ -814,11 +878,12 @@
}
case FR_WK:
- switch(toFreq)
+ 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;
@@ -828,7 +893,7 @@
}
case FR_BUS:
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return &asfreq_BtoA;
case FR_QTR: return &asfreq_BtoQ;
@@ -842,7 +907,7 @@
}
case FR_DAY:
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return &asfreq_DtoA;
case FR_QTR: return &asfreq_DtoQ;
@@ -859,7 +924,7 @@
}
case FR_HR:
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return &asfreq_HtoA;
case FR_QTR: return &asfreq_HtoQ;
@@ -875,7 +940,7 @@
}
case FR_MIN:
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return &asfreq_TtoA;
case FR_QTR: return &asfreq_TtoQ;
@@ -891,7 +956,7 @@
}
case FR_SEC:
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return &asfreq_StoA;
case FR_QTR: return &asfreq_StoQ;
@@ -919,6 +984,9 @@
int maxBusDaysPerYear, maxBusDaysPerQuarter, maxBusDaysPerMonth;
int maxDaysPerYear, maxDaysPerQuarter, maxDaysPerMonth;
+ int fromGroup = (fromFreq/1000)*1000;
+ int toGroup = (toFreq/1000)*1000;
+
maxBusDaysPerYear = 262;
maxBusDaysPerQuarter = 66;
maxBusDaysPerMonth = 23;
@@ -927,24 +995,26 @@
maxDaysPerQuarter = 92;
maxDaysPerMonth = 31;
- switch(fromFreq)
+
+
+ switch(fromGroup)
{
case FR_ANN: return 1;
case FR_QTR:
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return 4;
default: return 1;
}
case FR_MTH: //monthly
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return 12;
case FR_QTR: return 3;
default: return 1;
}
- case FR_WK: //monthly
- switch(toFreq)
+ case FR_WK: //weekly
+ switch(toGroup)
{
case FR_ANN: return 53;
case FR_QTR: return 13;
@@ -952,7 +1022,7 @@
default: return 1;
}
case FR_BUS: //business
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return maxBusDaysPerYear;;
case FR_QTR: return maxBusDaysPerQuarter;
@@ -961,7 +1031,7 @@
default: return 1;
}
case FR_DAY: //daily
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return maxDaysPerYear;;
case FR_QTR: return maxDaysPerQuarter;
@@ -970,7 +1040,7 @@
default: return 1;
}
case FR_HR: //hourly
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return 24 * maxDaysPerYear;;
case FR_QTR: return 24 * maxDaysPerQuarter;
@@ -981,7 +1051,7 @@
default: return 1;
}
case FR_MIN: //minutely
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return 24 * 60 * maxDaysPerYear;;
case FR_QTR: return 24 * 60 * maxDaysPerQuarter;
@@ -993,7 +1063,7 @@
default: return 1;
}
case FR_SEC: //minutely
- switch(toFreq)
+ switch(toGroup)
{
case FR_ANN: return 24 * 60 * 60 * maxDaysPerYear;;
case FR_QTR: return 24 * 60 * 60 * maxDaysPerQuarter;
@@ -1009,7 +1079,30 @@
}
}
+static void *get_asfreq_info(int fromFreq, int toFreq, struct asfreq_info *af_info) {
+ int maxBusDaysPerYear, maxBusDaysPerQuarter, maxBusDaysPerMonth;
+ int maxDaysPerYear, maxDaysPerQuarter, maxDaysPerMonth;
+
+ int fromGroup = (fromFreq/1000)*1000;
+ int toGroup = (toFreq/1000)*1000;
+
+ switch(fromGroup)
+ {
+ case FR_WK: {
+ af_info->from_week_end = fromFreq - fromGroup;
+ } break;
+ }
+
+ switch(toGroup)
+ {
+ case FR_WK: {
+ af_info->to_week_end = toFreq - toGroup;
+ } break;
+ }
+
+}
+
static char cseries_convert_doc[] = "";
static PyObject *
cseries_convert(PyObject *self, PyObject *args)
@@ -1032,12 +1125,13 @@
char *position;
int fromFreq, toFreq;
char relation;
+ struct asfreq_info af_info;
PyObject *val, *valMask;
- long (*asfreq_main)(long, char) = NULL;
- long (*asfreq_endpoints)(long, char) = NULL;
- long (*asfreq_reverse)(long, char) = NULL;
+ long (*asfreq_main)(long, char, struct asfreq_info) = NULL;
+ long (*asfreq_endpoints)(long, char, struct asfreq_info) = NULL;
+ long (*asfreq_reverse)(long, char, struct asfreq_info) = NULL;
returnVal = PyDict_New();
@@ -1069,20 +1163,22 @@
break;
}
+ get_asfreq_info(fromFreq, toFreq, &af_info);
+
asfreq_main = get_asfreq_func(fromFreq, toFreq, 1);
asfreq_endpoints = get_asfreq_func(fromFreq, toFreq, 0);
//convert start index to new frequency
- CHECK_ASFREQ(newStartTemp = asfreq_main(startIndex, 'B'));
+ CHECK_ASFREQ(newStartTemp = asfreq_main(startIndex, 'B', af_info));
if (newStartTemp < 1) {
- CHECK_ASFREQ(newStart = asfreq_endpoints(startIndex, 'A'));
+ CHECK_ASFREQ(newStart = asfreq_endpoints(startIndex, 'A', af_info));
}
else { newStart = newStartTemp; }
//convert end index to new frequency
- CHECK_ASFREQ(newEndTemp = asfreq_main(startIndex+array->dimensions[0]-1, 'A'));
+ CHECK_ASFREQ(newEndTemp = asfreq_main(startIndex+array->dimensions[0]-1, 'A', af_info));
if (newEndTemp < 1) {
- CHECK_ASFREQ(newEnd = asfreq_endpoints(startIndex+array->dimensions[0]-1, 'B'));
+ CHECK_ASFREQ(newEnd = asfreq_endpoints(startIndex+array->dimensions[0]-1, 'B', af_info));
}
else { newEnd = newEndTemp; }
@@ -1097,7 +1193,7 @@
if (newHeight > 1) {
long tempval;
asfreq_reverse = get_asfreq_func(toFreq, fromFreq, 0);
- CHECK_ASFREQ(tempval = asfreq_reverse(newStart, 'B'));
+ CHECK_ASFREQ(tempval = asfreq_reverse(newStart, 'B', af_info));
currPerLen = startIndex - tempval;
nd = 2;
@@ -1129,7 +1225,7 @@
val = PyArray_GETITEM(array, PyArray_GetPtr(array, &i));
valMask = PyArray_GETITEM(mask, PyArray_GetPtr(mask, &i));
- CHECK_ASFREQ(currIndex = asfreq_main(startIndex + i, relation));
+ CHECK_ASFREQ(currIndex = asfreq_main(startIndex + i, relation, af_info));
newIdx[0] = currIndex-newStart;
if (newHeight > 1) {
@@ -1179,10 +1275,13 @@
char *relation;
int fromFreq, toFreq;
long fromDate, toDate;
- long (*asfreq_main)(long, char) = NULL;
+ long (*asfreq_main)(long, char, struct asfreq_info) = NULL;
+ struct asfreq_info af_info;
if (!PyArg_ParseTuple(args, "Oiis:asfreq(fromDates, fromfreq, tofreq, relation)", &fromDates, &fromFreq, &toFreq, &relation)) return NULL;
+ get_asfreq_info(fromFreq, toFreq, &af_info);
+
asfreq_main = get_asfreq_func(fromFreq, toFreq, 0);
toDates = (PyArrayObject *)PyArray_Copy(fromDates);
@@ -1197,7 +1296,7 @@
fromDateObj = PyArray_GETITEM(fromDates, iterFrom->dataptr);
fromDate = PyInt_AsLong(fromDateObj);
- CHECK_ASFREQ(toDate = asfreq_main(fromDate, relation[0]));
+ CHECK_ASFREQ(toDate = asfreq_main(fromDate, relation[0], af_info));
toDateObj = PyInt_FromLong(toDate);
PyArray_SETITEM(toDates, iterTo->dataptr, toDateObj);
@@ -1269,8 +1368,9 @@
long absdate;
double abstime;
- long (*toDaily)(long, char) = NULL;
+ long (*toDaily)(long, char, struct asfreq_info) = NULL;
int (*getDateInfo)(struct date_info) = NULL;
+ struct asfreq_info af_info;
if (!PyArg_ParseTuple(args, "Ois:getDateInfo(array, freq, info)", &array, &freq, &info)) return NULL;
newArray = (PyArrayObject *)PyArray_Copy(array);
@@ -1279,6 +1379,7 @@
iterResult = (PyArrayIterObject *)PyArray_IterNew((PyObject *)newArray);
toDaily = get_asfreq_func(freq, FR_DAY, 0);
+ get_asfreq_info(freq, FR_DAY, &af_info);
switch(*info)
{
@@ -1321,7 +1422,7 @@
val = PyArray_GETITEM(array, iterSource->dataptr);
dateNum = PyInt_AsLong(val);
Py_DECREF(val);
- CHECK_ASFREQ(absdate = toDaily(dateNum, 'B'));
+ CHECK_ASFREQ(absdate = toDaily(dateNum, 'B', af_info));
abstime = getAbsTime(freq, absdate, dateNum);
if(dInfoCalc_SetFromAbsDateTime(&convDate, absdate, abstime, GREGORIAN_CALENDAR)) return NULL;
@@ -1464,7 +1565,16 @@
ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_ANN", FR_ANN);
ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_QTR", FR_QTR);
ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_MTH", FR_MTH);
+
ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_WK", FR_WK);
+ ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_WKSUN", FR_WKSUN);
+ ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_WKSAT", FR_WKSAT);
+ ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_WKFRI", FR_WKFRI);
+ ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_WKTHU", FR_WKTHU);
+ ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_WKWED", FR_WKWED);
+ ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_WKTUE", FR_WKTUE);
+ ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_WKMON", FR_WKMON);
+
ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_BUS", FR_BUS);
ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_DAY", FR_DAY);
ADD_INT_TO_DICT(TSER_CONSTANTS, "FR_HR", FR_HR);
More information about the Scipy-svn
mailing list