[Scipy-svn] r2574 - trunk/Lib/sandbox/timeseries/src
scipy-svn at scipy.org
scipy-svn at scipy.org
Tue Jan 16 15:10:14 EST 2007
Author: mattknox_ca
Date: 2007-01-16 14:10:11 -0600 (Tue, 16 Jan 2007)
New Revision: 2574
Modified:
trunk/Lib/sandbox/timeseries/src/cseries.c
Log:
updated cseries_getDateInfo function to support more attributes
Modified: trunk/Lib/sandbox/timeseries/src/cseries.c
===================================================================
--- trunk/Lib/sandbox/timeseries/src/cseries.c 2007-01-16 19:23:36 UTC (rev 2573)
+++ trunk/Lib/sandbox/timeseries/src/cseries.c 2007-01-16 20:10:11 UTC (rev 2574)
@@ -156,6 +156,9 @@
return result;
}
+// needed for getDateInfo function
+static long asfreq_DtoD(long fromDate, char relation) { return fromDate; }
+
static long asfreq_DtoHIGHFREQ(long fromDate, char relation, long periodsPerDay) {
if (fromDate >= minval_D_toHighFreq) {
if (relation == 'B') { return (fromDate - minval_D_toHighFreq)*(periodsPerDay) + 1; }
@@ -480,6 +483,7 @@
case 'B':
if (forConvert) { return &asfreq_DtoB_forConvert; }
else { return &asfreq_DtoB; }
+ case 'D': return &asfreq_DtoD;
case 'H': return &asfreq_DtoH;
case 'T': return &asfreq_DtoT;
case 'S': return &asfreq_DtoS;
@@ -833,8 +837,51 @@
static long dInfo_quarter(mxDateTimeObject *dateObj) { return ((dateObj->month-1)/3)+1; }
static long dInfo_month(mxDateTimeObject *dateObj) { return dateObj->month; }
static long dInfo_day(mxDateTimeObject *dateObj) { return dateObj->day; }
-static long dInfo_dow(mxDateTimeObject *dateObj) { return dateObj->day_of_week; }
+static long dInfo_day_of_year(mxDateTimeObject *dateObj) { return dateObj->day_of_year; }
+static long dInfo_day_of_week(mxDateTimeObject *dateObj) { return dateObj->day_of_week; }
+static long dInfo_week(mxDateTimeObject *dateObj) {
+ long year, week, day;
+ PyObject *ISOWeekTuple = NULL;
+ ISOWeekTuple = PyObject_GetAttrString(dateObj, "iso_week");
+
+ if (!PyArg_ParseTuple(ISOWeekTuple,"iii;need a ISO Week 3-tuple (year,week,day)",
+ &year,&week,&day)) return NULL;
+
+ Py_DECREF(ISOWeekTuple);
+
+ return week;
+}
+static long dInfo_hour(mxDateTimeObject *dateObj) { return dateObj->hour; }
+static long dInfo_minute(mxDateTimeObject *dateObj) { return dateObj->minute; }
+static long dInfo_second(mxDateTimeObject *dateObj) { return dateObj->second; }
+
+static double getAbsTime(char freq, long dailyDate, long originalDate) {
+
+ double periodsPerDay, result;
+ long startOfDay;
+
+ switch(freq)
+ {
+ case 'H':
+ periodsPerDay = 24;
+ break;
+ case 'T':
+ periodsPerDay = 24*60;
+ break;
+ case 'S':
+ periodsPerDay = 24*60*60;
+ break;
+ default:
+ return 0;
+ }
+
+ startOfDay = asfreq_DtoHIGHFREQ(dailyDate, 'B', periodsPerDay);
+ return (24*60*60)*((double)(originalDate - startOfDay))/periodsPerDay;
+}
+
+
+
static char cseries_getDateInfo_doc[] = "";
static PyObject *
cseries_getDateInfo(PyObject *self, PyObject *args)
@@ -849,6 +896,7 @@
PyObject *val;
long dateNum, dInfo;
+ double absdate, abstime;
long (*toDaily)(long, char) = NULL;
long (*getDateInfo)(mxDateTimeObject*) = NULL;
@@ -875,9 +923,24 @@
case 'D': //day
getDateInfo = &dInfo_day;
break;
+ case 'R': //day of year
+ getDateInfo = &dInfo_day_of_year;
+ break;
case 'W': //day of week
- getDateInfo = &dInfo_dow;
+ getDateInfo = &dInfo_day_of_week;
break;
+ case 'I': //week of year
+ getDateInfo = &dInfo_week;
+ break;
+ case 'H': //hour
+ getDateInfo = &dInfo_hour;
+ break;
+ case 'T': //minute
+ getDateInfo = &dInfo_minute;
+ break;
+ case 'S': //second
+ getDateInfo = &dInfo_second;
+ break;
default:
return NULL;
}
@@ -886,8 +949,10 @@
val = PyArray_GETITEM(array, iterSource->dataptr);
dateNum = PyInt_AsLong(val);
+ absdate = (double)toDaily(dateNum, 'B');
+ abstime = getAbsTime(*freq, absdate, dateNum);
- convDate = (mxDateTimeObject *)mxDateTime.DateTime_FromAbsDateAndTime(toDaily(dateNum, 'A'), 0);
+ convDate = (mxDateTimeObject *)mxDateTime.DateTime_FromAbsDateAndTime(absdate, abstime);
dInfo = getDateInfo(convDate);
Py_DECREF(convDate);
More information about the Scipy-svn
mailing list