I have compiled a list that uses the list of dates as an index, for example:
>>> import datedlist
>>> import datetime
>>> dates = [datetime.date(2012,1,x) for x in range(2,6)]
>>> values = range(4,8)
>>> dates
[datetime.date(2012, 1, 2), datetime.date(2012, 1, 3), datetime.date(2012, 1, 4), datetime.date(2012, 1, 5)]
>>> dl = datedlist.DatedList(values, dates)
>>> dl
[4, 5, 6, 7]
>>> dl[datetime.date(2012,1,3)]
5
So far so good, but I also want to be able to use slicing (not extended slicing), for example (the following: not ) - this is the result I want):
>>> datedlist[datetime.date(2012,1,3):datetime.date(2012,1,4)]
[5, 6]
Here is my attempt (which obviously doesn't work):
class DatedList(list):
def __init__(self, values, dates):
self.dates = dates
list.__init__(self, values)
def __getitem__(self, date):
if isinstance(date, slice):
start = self.dates.index(slice[0])
end = self.dates.index(slice[1])
return [list.__getitem__(self, index) for index in range(start, end)]
elif isinstance( date, datetime.date ) :
index = self.dates.index(date)
return list.__getitem__(self, index)
elif isinstance(date, int):
if date < 0:
date += len(self)
if date >= len(self):
raise IndexError, "index out of range {}".format(date)
return list.__getitem__(self, date)
else:
raise TypeError, "Invalid argument type."
Slice [0] and slice [1] are intended only to explain my intention. The value isinstance (date, int) is only available for debugging - it will be deleted for production code.
Here's the question : how can I implement slicing that uses datetime.date objects as indexes?
EDIT ( gnibblers):
getlice ( , getlice ).
( isinstance-slice - ):
class DatedList(list):
def __init__(self, values, dates):
self.dates = dates
list.__init__(self, values)
def __contains__(self, date):
return date in self.dates
def __getslice__(self, fromdate, todate):
i_from = self.get_index(fromdate)
i_to = self.get_index(todate)
print i_from, i_to
return [list.__getitem__(self, i) for i in range(i_from, i_to)]
def __getitem__(self, date):
if isinstance(date, slice):
pass
elif isinstance(date, datetime.date):
index = self.get_index(date)
return list.__getitem__(self, index)
elif isinstance(date, int):
if date < 0:
date += len(self)
if date >= len(self):
raise IndexError, "index out of range {}".format(date)
return list.__getitem__(self, date)
else:
raise TypeError, "Invalid argument type."
def get_index(self, date):
if date in self.dates:
index = self.dates.index(date)
elif date < self.dates[0]:
index = 0
elif date > self.dates[-1]:
index = len(self.dates) - 1
return index
:
>>> print dl[datetime.date(2012,1,3):datetime.date(2012,1,5)]
>>> None
-, getlice , . , getitem , , , , datetime.date .
/EDIT
. -, , , , -, ( ):
: [] :
dl = DatedList(values, dates)
value = dl[some_date]
value = dl.value(same_date)
dict, , slicing.
collection.Sequence, :
TypeError: init ' ' list ', ' DatedList '