[Scipy-svn] r2776 - trunk/Lib/sandbox/timeseries
scipy-svn at scipy.org
scipy-svn at scipy.org
Wed Feb 28 11:50:07 EST 2007
Author: mattknox_ca
Date: 2007-02-28 10:50:02 -0600 (Wed, 28 Feb 2007)
New Revision: 2776
Modified:
trunk/Lib/sandbox/timeseries/tdates.py
Log:
eliminated most usage of mx.DateTime
Modified: trunk/Lib/sandbox/timeseries/tdates.py
===================================================================
--- trunk/Lib/sandbox/timeseries/tdates.py 2007-02-28 14:04:16 UTC (rev 2775)
+++ trunk/Lib/sandbox/timeseries/tdates.py 2007-02-28 16:50:02 UTC (rev 2776)
@@ -10,7 +10,8 @@
__revision__ = "$Revision$"
__date__ = '$Date$'
-import datetime
+import datetime as dt
+
import itertools
import warnings
import types
@@ -26,7 +27,12 @@
import maskedarray as MA
-import mx.DateTime as mxD
+try:
+ from mx.DateTime import DateTimeType
+except ImportError:
+ class DateTimeType: pass
+
+
from mx.DateTime.Parser import DateFromString as mxDFromString
import tcore as corelib
@@ -47,11 +53,13 @@
#####---------------------------------------------------------------------------
#---- --- Date Info ---
#####---------------------------------------------------------------------------
-OriginDate = mxD.Date(1970)
-secondlyOriginDate = OriginDate - mxD.DateTimeDeltaFrom(seconds=1)
-minutelyOriginDate = OriginDate - mxD.DateTimeDeltaFrom(minutes=1)
-hourlyOriginDate = OriginDate - mxD.DateTimeDeltaFrom(hours=1)
+OriginDate = dt.datetime(1970, 1, 1)
+secondlyOriginDate = OriginDate - dt.timedelta(seconds=1)
+minutelyOriginDate = OriginDate - dt.timedelta(minutes=1)
+hourlyOriginDate = OriginDate - dt.timedelta(hours=1)
+
+
#####---------------------------------------------------------------------------
#---- --- Date Exceptions ---
#####---------------------------------------------------------------------------
@@ -107,16 +115,14 @@
>>> ts.Date('D', '2007-01-01')
- - Use the `mxDate` keyword with an existing mx.DateTime.DateTime object, or
- even a datetime.datetime object.
-
- >>> td.Date('D', mxDate=mx.DateTime.now())
- >>> td.Date('D', mxDate=datetime.datetime.now())
+ - Use the `datetime` keyword with an existing datetime.datetime object.
+
+ >>> td.Date('D', datetime=datetime.datetime.now())
"""
default_fmtstr = {'A': "%Y",
'Q': "%YQ%q",
'M': "%b-%Y",
- 'W': "%d-%b-%y",
+ 'W': "%d-%b-%Y",
'B': "%d-%b-%Y",
'D': "%d-%b-%Y",
'U': "%d-%b-%Y",
@@ -128,7 +134,7 @@
def __init__(self, freq, value=None, string=None,
year=None, month=None, day=None, quarter=None,
hour=None, minute=None, second=None,
- mxDate=None):
+ datetime=None):
if hasattr(freq, 'freq'):
self.freq = corelib.check_freq(freq.freq)
@@ -138,40 +144,43 @@
if value is not None:
+ if isinstance(value, ndarray):
+ value = int(value)
+
if isinstance(value, str):
- self.mxDate = mxDFromString(value)
+ self.datetime = mx_to_datetime(mxDFromString(value))
elif self.freqstr == 'A':
- self.mxDate = mxD.Date(value, -1, -1)
+ self.datetime = dt.datetime(value, 1, 1)
elif self.freqstr == 'B':
valtmp = (value - 1)//5
- #... (value + valtmp*7 - valtmp*5)
- self.mxDate = mxD.DateTimeFromAbsDateTime(value + valtmp*2)
+ self.datetime = dt.datetime.fromordinal(value + valtmp*2)
elif self.freqstr in ['D','U']:
- self.mxDate = mxD.DateTimeFromAbsDateTime(value)
+ self.datetime = dt.datetime.fromordinal(value)
elif self.freqstr == 'H':
- self.mxDate = hourlyOriginDate + mxD.DateTimeDeltaFrom(hours=value)
+ self.datetime = hourlyOriginDate + dt.timedelta(hours=value)
elif self.freqstr == 'M':
- self.mxDate = mxD.DateTimeFromAbsDateTime(1) + \
- mxD.RelativeDateTime(months=value-1, day=-1)
+ year = (value - 1)//12 + 1
+ month = value - (year - 1)*12
+ self.datetime = dt.datetime(year, month, 1)
elif self.freqstr == 'Q':
- self.mxDate = mxD.DateTimeFromAbsDateTime(1) + \
- mxD.RelativeDateTime(years=(value // 4),
- month=((value * 3) % 12), day=-1)
+ year = (value - 1)//4 + 1
+ month = (value - (year - 1)*4)*3
+ self.datetime = dt.datetime(year, month, 1)
elif self.freqstr == 'S':
- self.mxDate = secondlyOriginDate + mxD.DateTimeDeltaFromSeconds(value)
+ self.datetime = secondlyOriginDate + dt.timedelta(seconds=value)
elif self.freqstr == 'T':
- self.mxDate = minutelyOriginDate + mxD.DateTimeDeltaFrom(minutes=value)
+ self.datetime = minutelyOriginDate + dt.timedelta(minutes=value)
elif self.freqstr == 'W':
- self.mxDate = mxD.Date(1,1,7) + \
- mxD.RelativeDateTime(weeks=value-1)
+ self.datetime = dt.datetime(1,1,7) + \
+ dt.timedelta(days=(value-1)*7)
elif string is not None:
- self.mxDate = mxDFromString(string)
+ self.datetime = mx_to_datetime(mxDFromString(string))
- elif mxDate is not None:
- if isinstance(mxDate, datetime.datetime):
- mxDate = mxD.strptime(mxDate.isoformat()[:19], "%Y-%m-%dT%H:%M:%S")
- self.mxDate = truncateDate(self.freq, mxDate)
+ elif datetime is not None:
+ if isinstance(datetime, DateTimeType):
+ datetime = mx_to_datetime(datetime)
+ self.datetime = truncateDate(self.freq, datetime)
else:
# First, some basic checks.....
@@ -183,23 +192,23 @@
elif self.freqstr == 'M':
if month is None:
raise InsufficientDateError
- day = -1
+ day = 1
elif self.freqstr == 'Q':
if quarter is None:
raise InsufficientDateError
month = quarter * 3
- day = -1
+ day = 1
elif self.freqstr == 'A':
- month = -1
- day = -1
+ month = 1
+ day = 1
elif self.freqstr == 'S':
if month is None or day is None or second is None:
raise InsufficientDateError
if self.freqstr in ['A','B','D','M','Q','W']:
- self.mxDate = truncateDate(self.freq, mxD.Date(year, month, day))
+ self.datetime = truncateDate(self.freq, dt.datetime(year, month, day))
if self.freqstr == 'B':
- if self.mxDate.day_of_week in [5,6]:
+ if self.datetime.isoweekday() in [6,7]:
raise ValueError("Weekend passed as business day")
elif self.freqstr in 'HTS':
if hour is None:
@@ -219,9 +228,9 @@
second = 0
else:
second = second % 60
- self.mxDate = truncateDate(self.freqstr,
- mxD.Date(year, month, day,
- hour, minute, second))
+ self.datetime = truncateDate(self.freqstr,
+ dt.datetime(year, month, day,
+ hour, minute, second))
self.value = self.__value()
def __getitem__(self, indx):
@@ -321,34 +330,36 @@
"Converts the date to an integer, depending on the current frequency."
# Annual .......
if self.freqstr == 'A':
- val = self.mxDate.year
+ val = self.datetime.year
+ # Quarterly.....
+ elif self.freqstr == 'Q':
+ val = (self.datetime.year-1)*4 + self.datetime.month//3
+ # Monthly.......
+ elif self.freqstr == 'M':
+ val = (self.datetime.year-1)*12 + self.datetime.month
+ # Weekly........
+ elif self.freqstr == 'W':
+ val = self.datetime.toordinal()//7
# Business days.
elif self.freqstr == 'B':
- days = self.mxDate.absdate
+ days = self.datetime.toordinal()
weeks = days // 7
val = days - weeks*2
- # (weeks*5) + (days - weeks*7)
# Daily/undefined
elif self.freqstr in 'DU':
- val = self.mxDate.absdate
+ val = self.datetime.toordinal()
# Hourly........
elif self.freqstr == 'H':
- val = (self.mxDate - hourlyOriginDate).hours
- # Monthly.......
- elif self.freqstr == 'M':
- val = (self.mxDate.year-1)*12 + self.mxDate.month
- # Quarterly.....
- elif self.freqstr == 'Q':
- val = (self.mxDate.year-1)*4 + self.mxDate.month//3
+ delta = (self.datetime - hourlyOriginDate)
+ val = delta.days*24 + delta.seconds/(3600)
+ # Minutely......
+ elif self.freqstr == 'T':
+ delta = (self.datetime - minutelyOriginDate)
+ val = delta.days*1440 + delta.seconds/(60)
# Secondly......
elif self.freqstr == 'S':
- val = (self.mxDate - secondlyOriginDate).seconds
- # Minutely......
- elif self.freqstr == 'T':
- val = (self.mxDate - minutelyOriginDate).minutes
- # Weekly........
- elif self.freqstr == 'W':
- val = self.mxDate.absdate//7
+ delta = (self.datetime - secondlyOriginDate)
+ val = delta.days*86400 + delta.seconds
return int(val)
#......................................................
def strfmt(self, fmt):
@@ -356,7 +367,7 @@
if fmt is None:
fmt = self.default_fmtstr[self.freqstr]
qFmt = fmt.replace("%q", "XXXX")
- tmpStr = self.mxDate.strftime(qFmt)
+ tmpStr = self.datetime.strftime(qFmt)
if "XXXX" in tmpStr:
tmpStr = tmpStr.replace("XXXX", str(self.quarter))
return tmpStr
@@ -369,11 +380,11 @@
#......................................................
def toordinal(self):
"Returns the date as an ordinal."
- return self.mxDate.absdays
+ return self.datetime.toordinal()
def fromordinal(self, ordinal):
"Returns the date as an ordinal."
- return Date(self.freq, mxDate=mxD.DateTimeFromAbsDays(ordinal))
+ return Date(self.freq, datetime=dt.datetime.fromordinal(ordinal))
def tostring(self):
"Returns the date as a string."
@@ -394,30 +405,39 @@
#####---------------------------------------------------------------------------
#---- --- Functions ---
#####---------------------------------------------------------------------------
-def truncateDate(freq, mxDate):
- """Chops off the irrelevant information from the mxDate passed in."""
+
+def mx_to_datetime(mxDate):
+ microsecond = 1000000*(mxDate.second % 1)
+ return dt.datetime(mxDate.year, mxDate.month,
+ mxDate.day, mxDate.hour,
+ mxDate.minute,
+ int(mxDate.second), microsecond)
+
+
+def truncateDate(freq, datetime):
+ "Chops off the irrelevant information from the datetime object passed in."
freqstr = corelib.check_freqstr(freq)
if freqstr == 'A':
- return mxD.Date(mxDate.year)
+ return dt.datetime(datetime.year, 1, 1)
elif freqstr == 'Q':
- return mxD.Date(mxDate.year, monthToQuarter(mxDate.month)*3)
+ return dt.datetime(datetime.year, monthToQuarter(datetime.month)*3, 1)
elif freqstr == 'M':
- return mxD.Date(mxDate.year, mxDate.month)
+ return dt.datetime(datetime.year, datetime.month, 1)
elif freqstr == 'W':
- d = mxDate.absdate
- return mxD.DateTimeFromAbsDateTime(d + (7 - d % 7) % 7)
+ d = datetime.toordinal()
+ return dt.datetime.fromordinal(d + (7 - d % 7) % 7)
elif freqstr in 'BD':
- if freq == 'B' and mxDate.day_of_week in [5,6]:
+ if freq == 'B' and datetime.isoweekday() in (6,7):
raise ValueError("Weekend passed as business day")
- return mxD.Date(mxDate.year, mxDate.month, mxDate.day)
+ return dt.datetime(datetime.year, datetime.month, datetime.day)
elif freqstr == 'H':
- return mxD.Date(mxDate.year, mxDate.month, mxDate.day, \
- mxDate.hour)
+ return dt.datetime(datetime.year, datetime.month, datetime.day, \
+ datetime.hour)
elif freqstr == 'T':
- return mxD.Date(mxDate.year, mxDate.month, mxDate.day, \
- mxDate.hour, mxDate.minute)
+ return dt.datetime(datetime.year, datetime.month, datetime.day, \
+ datetime.hour, datetime.minute)
else:
- return mxDate
+ return datetime
def monthToQuarter(monthNum):
"""Returns the quarter corresponding to the month `monthnum`.
@@ -427,12 +447,12 @@
def thisday(freq):
"Returns today's date, at the given frequency `freq`."
freqstr = corelib.check_freqstr(freq)
- tempDate = mxD.now()
+ tempDate = dt.datetime.now()
# if it is Saturday or Sunday currently, freq==B, then we want to use Friday
- if freqstr == 'B' and tempDate.day_of_week >= 5:
- tempDate -= (tempDate.day_of_week - 4)
+ if freqstr == 'B' and tempDate.isoweekday() >= 6:
+ tempDate = tempDate - dt.timedelta(days=(tempDate.isoweekday() - 5))
if freqstr in ('B','D','H','S','T','W','U'):
- return Date(freq, mxDate=tempDate)
+ return Date(freq, datetime=tempDate)
elif freqstr == 'M':
return Date(freq, year=tempDate.year, month=tempDate.month)
elif freqstr == 'Q':
@@ -443,7 +463,7 @@
def prevbusday(day_end_hour=18, day_end_min=0):
"Returns the previous business day."
- tempDate = mxD.localtime()
+ tempDate = dt.datetime.now()
dateNum = tempDate.hour + float(tempDate.minute)/60
checkNum = day_end_hour + float(day_end_min)/60
if dateNum < checkNum:
@@ -874,13 +894,13 @@
ords = numpy.fromiter((s.absdays for s in dlist), float_)
ords += 1
freq = guess_freq(ords)
- dates = [Date(freq, mxDate=m) for m in dlist]
+ dates = [Date(freq, datetime=m) for m in dlist]
#...as datetime objects
elif hasattr(template, 'toordinal'):
ords = numpy.fromiter((d.toordinal() for d in dlist), float_)
if freq is None:
freq = guess_freq(ords)
- dates = [Date(freq, mxDate=mxD.DateTimeFromAbsDays(a)) for a in ords]
+ dates = [Date(freq, datetime=dt.datetime.fromordinal(a)) for a in ords]
#
result = DateArray(dates, freq)
return result
More information about the Scipy-svn
mailing list