Changeset 1503

Show
Ignore:
Timestamp:
09/27/08 11:15:06 (2 months ago)
Author:
mattknox_ca
Message:

use strftime from datetime object instead of standard c strftime function

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/timeseries/scikits/timeseries/src/c_dates.c

    r1479 r1503  
    16911691} 
    16921692 
     1693// helper function for date property funcs 
     1694static int 
     1695DateObject_set_date_info_wtime(DateObject *self, struct date_info *dinfo) { 
     1696    PyObject *daily_obj = DateObject_toordinal(self); 
     1697    long absdate = PyInt_AsLong(daily_obj); 
     1698    double abstime; 
     1699 
     1700    Py_DECREF(daily_obj); 
     1701 
     1702    abstime = getAbsTime(self->freq, absdate, self->value); 
     1703 
     1704    if(dInfoCalc_SetFromAbsDateTime(dinfo, absdate, abstime, 
     1705                                    GREGORIAN_CALENDAR)) return -1; 
     1706 
     1707    return 0; 
     1708} 
     1709 
     1710static PyObject * 
     1711DateObject_datetime(DateObject *self, void *closure) { 
     1712    PyObject *datetime; 
     1713    int hour=0, minute=0, second=0; 
     1714    int freq_group; 
     1715    struct date_info dinfo; 
     1716 
     1717    if(DateObject_set_date_info_wtime(self, &dinfo) == -1) return NULL; 
     1718    freq_group = get_freq_group(self->freq); 
     1719 
     1720    switch(freq_group) { 
     1721        case FR_HR: 
     1722            hour = dinfo.hour; 
     1723            break; 
     1724        case FR_MIN: 
     1725            hour = dinfo.hour; 
     1726            minute = dinfo.minute; 
     1727            break; 
     1728        case FR_SEC: 
     1729            hour = dinfo.hour; 
     1730            minute = dinfo.minute; 
     1731            second = (int)dinfo.second; 
     1732            break; 
     1733    } 
     1734 
     1735    datetime = PyDateTime_FromDateAndTime( 
     1736                dinfo.year, dinfo.month, dinfo.day, hour, minute, second, 0); 
     1737    return datetime; 
     1738} 
     1739 
    16931740static char DateObject_strfmt_doc[] = 
    16941741"Deprecated alias for strftime method"; 
     
    17161763 
    17171764    char *orig_fmt_str, *fmt_str; 
    1718     char *result; 
    17191765 
    17201766    int num_extra_fmts = 3; 
     
    17261772    int extra_fmts_found[3] = {0,0,0}; 
    17271773    int extra_fmts_found_one = 0; 
    1728     struct tm c_date; 
    1729     struct date_info tempDate; 
    17301774    long absdate; 
    1731     double abstime; 
    1732     int i, result_len; 
    1733     PyObject *py_result; 
     1775    int i; 
     1776    PyObject *py_result, *py_datetime; 
    17341777 
    17351778    long (*toDaily)(long, char, asfreq_info*) = NULL; 
    17361779    asfreq_info af_info; 
    17371780 
    1738     if (!PyArg_ParseTuple(args, "s:strftime(fmt)", &orig_fmt_str)) return NULL; 
     1781    if (!PyArg_ParseTuple(args, "s:strftime(fmt)", &orig_fmt_str)) { return NULL; } 
    17391782 
    17401783    toDaily = get_asfreq_func(self->freq, FR_DAY, 0); 
    17411784    get_asfreq_info(self->freq, FR_DAY, &af_info); 
    1742  
    17431785    absdate = toDaily(self->value, 'E', &af_info); 
    1744     abstime = getAbsTime(self->freq, absdate, self->value); 
    1745  
    1746     if(dInfoCalc_SetFromAbsDateTime(&tempDate, absdate, abstime, 
    1747                                     GREGORIAN_CALENDAR)) return NULL; 
    1748  
    1749     // populate standard C date struct with info from our date_info struct 
    1750     c_date.tm_sec = (int)tempDate.second; 
    1751     c_date.tm_min = tempDate.minute; 
    1752     c_date.tm_hour = tempDate.hour; 
    1753     c_date.tm_mday = tempDate.day; 
    1754     c_date.tm_mon = tempDate.month - 1; 
    1755     c_date.tm_year = tempDate.year - 1900; 
    1756     c_date.tm_wday = tempDate.day_of_week; 
    1757     c_date.tm_yday = tempDate.day_of_year; 
    1758     c_date.tm_isdst = -1; 
    1759  
    1760     result_len = strlen(orig_fmt_str) + 50; 
    1761     if ((result = PyArray_malloc(result_len * sizeof(char))) == NULL) {return PyErr_NoMemory();} 
    17621786 
    17631787    fmt_str = orig_fmt_str; 
     
    17811805    } 
    17821806 
    1783     strftime(result, result_len, fmt_str, &c_date); 
     1807    py_datetime = DateObject_datetime(self, NULL); 
     1808    py_result = PyObject_CallMethod( 
     1809        py_datetime, "strftime", "s", fmt_str) ; 
     1810    Py_DECREF(py_datetime); 
     1811 
    17841812    if (extra_fmts_found_one) { free(fmt_str); } 
    17851813 
     
    17871815    for(i=0; i < num_extra_fmts; i++) { 
    17881816        if (extra_fmts_found[i]) { 
    1789             char *tmp_str = result; 
     1817            PyObject *temp_result; 
    17901818            char *extra_str; 
    17911819 
     
    18071835                if(strcmp(extra_fmts[i][0], "%q") == 0) { 
    18081836                    if ((extra_str = PyArray_malloc(2 * sizeof(char))) == NULL) { 
    1809                         free(tmp_str); 
     1837                        Py_DECREF(py_result); 
    18101838                        return PyErr_NoMemory(); 
    18111839                    } 
     
    18201848 
    18211849                    if ((extra_str = PyArray_malloc((year_len+1) * sizeof(char))) == NULL) { 
    1822                         free(tmp_str); 
     1850                        Py_DECREF(py_result); 
    18231851                        return PyErr_NoMemory(); 
    18241852                    } 
     
    18341862            } 
    18351863 
    1836             result = str_replace(result, extra_fmts[i][1], extra_str); 
    1837             free(tmp_str); 
     1864            temp_result = PyObject_CallMethod( 
     1865                py_result, "replace", "ss", extra_fmts[i][1], extra_str); 
     1866            Py_DECREF(py_result); 
     1867            py_result = temp_result; 
     1868 
    18381869            free(extra_str); 
    1839             if (result == NULL) { return NULL; } 
     1870            if (py_result == NULL) { return NULL; } 
    18401871        } 
    18411872    } 
    1842  
    1843     py_result = PyString_FromString(result); 
    1844     free(result); 
    18451873 
    18461874    return py_result; 
     
    20932121} 
    20942122 
    2095 // helper function for date property funcs 
    2096 static int 
    2097 DateObject_set_date_info_wtime(DateObject *self, struct date_info *dinfo) { 
    2098     PyObject *daily_obj = DateObject_toordinal(self); 
    2099     long absdate = PyInt_AsLong(daily_obj); 
    2100     double abstime; 
    2101  
    2102     Py_DECREF(daily_obj); 
    2103  
    2104     abstime = getAbsTime(self->freq, absdate, self->value); 
    2105  
    2106     if(dInfoCalc_SetFromAbsDateTime(dinfo, absdate, abstime, 
    2107                                     GREGORIAN_CALENDAR)) return -1; 
    2108  
    2109     return 0; 
    2110 } 
    2111  
    21122123static PyObject * 
    21132124DateObject_year(DateObject *self, void *closure) { 
     
    22122223    if(DateObject_set_date_info_wtime(self, &dinfo) == -1) return NULL; 
    22132224    return PyInt_FromLong((int)dinfo.second); 
    2214 } 
    2215  
    2216 static PyObject * 
    2217 DateObject_datetime(DateObject *self, void *closure) { 
    2218     PyObject *datetime; 
    2219     int hour=0, minute=0, second=0; 
    2220     int freq_group; 
    2221     struct date_info dinfo; 
    2222  
    2223     if(DateObject_set_date_info_wtime(self, &dinfo) == -1) return NULL; 
    2224     freq_group = get_freq_group(self->freq); 
    2225  
    2226     switch(freq_group) { 
    2227         case FR_HR: 
    2228             hour = dinfo.hour; 
    2229             break; 
    2230         case FR_MIN: 
    2231             hour = dinfo.hour; 
    2232             minute = dinfo.minute; 
    2233             break; 
    2234         case FR_SEC: 
    2235             hour = dinfo.hour; 
    2236             minute = dinfo.minute; 
    2237             second = (int)dinfo.second; 
    2238             break; 
    2239     } 
    2240  
    2241     datetime = PyDateTime_FromDateAndTime( 
    2242                 dinfo.year, dinfo.month, dinfo.day, hour, minute, second, 0); 
    2243     return datetime; 
    22442225} 
    22452226