Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Why can't timedeltas be divided?

Reply
Thread Tools

Why can't timedeltas be divided?

 
 
Dan Bishop
Guest
Posts: n/a
 
      05-24-2006
If I try to write something like:

num_weeks = time_diff / datetime.timedelta(days=7)

I get:

TypeError: unsupported operand type(s) for /: 'datetime.timedelta'
and 'datetime.timedelta'

Of course, one could extend the timedelta class to implement division,

def _microseconds(self):
return (self.days * 86400 + self.seconds) * 1000000 +
self.microseconds
def __truediv__(self, other):
if isinstance(other, datetime.timedelta):
return self._microseconds() / other._microseconds()
else:
return datetime.timedelta(0, 0, self._microseconds() /
other)
def __floordiv__(self, other):
if isinstance(other, datetime.timedelta):
return self._microseconds() // other._microseconds()
return NotImplemented

but why is a basic arithmetic operation missing from the standard
datetime module?

 
Reply With Quote
 
 
 
 
Maric Michaud
Guest
Posts: n/a
 
      05-24-2006
Le Jeudi 25 Mai 2006 00:07, Dan Bishop a écrit*:
> If I try to write something like:
>
> * * num_weeks = time_diff / datetime.timedelta(days=7)


because it has no meaning, what you want is :

num_weeks = time_diff.days / 7
or
num_weeks = (time_diff / 7).days


--
_____________

Maric Michaud
_____________

Aristote - www.aristote.info
3 place des tapis
69004 Lyon
Tel: +33 426 880 097
 
Reply With Quote
 
 
 
 
John Machin
Guest
Posts: n/a
 
      05-24-2006
On 25/05/2006 8:25 AM, Maric Michaud wrote:
> Le Jeudi 25 Mai 2006 00:07, Dan Bishop a écrit :
>> If I try to write something like:
>>
>> num_weeks = time_diff / datetime.timedelta(days=7)

>
> because it has no meaning, what you want is :
>
> num_weeks = time_diff.days / 7
> or
> num_weeks = (time_diff / 7).days
>
>


The ratio of two durations has no meaning???
 
Reply With Quote
 
John Machin
Guest
Posts: n/a
 
      05-24-2006
On 25/05/2006 8:25 AM, Maric Michaud wrote:
> Le Jeudi 25 Mai 2006 00:07, Dan Bishop a écrit :
>> If I try to write something like:
>>
>> num_weeks = time_diff / datetime.timedelta(days=7)

>
> because it has no meaning, what you want is :
>
> num_weeks = time_diff.days / 7
> or
> num_weeks = (time_diff / 7).days
>
>


The ratio of two durations has no meaning???

 
Reply With Quote
 
Robert Kern
Guest
Posts: n/a
 
      05-25-2006
Maric Michaud wrote:
> Le Jeudi 25 Mai 2006 00:07, Dan Bishop a écrit :
>
>>If I try to write something like:
>>
>> num_weeks = time_diff / datetime.timedelta(days=7)

>
> because it has no meaning,


Yes, it does.

> what you want is :
>
> num_weeks = time_diff.days / 7
> or
> num_weeks = (time_diff / 7).days


Uh, no. Besides the integer division problem in your first line, keep in mind
that the .days attribute does not give you the time interval measured in days.
It gives you the number of *whole* days in the interval. The first method will
be incorrect if time_diff is not an even multiple of 1 day. The latter will be
incorrect if time_diff is not an even multiple of 7 days.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco

 
Reply With Quote
 
Maric Michaud
Guest
Posts: n/a
 
      05-25-2006
oups ididn't post it to the good thread

Le Jeudi 25 Mai 2006 01:10, vous avez écrit :
> The ratio of two durations has no meaning???

Oh, sorry, sure it has, I wanted to say "it has no meaning in timedelta
provided arithmetic".
It's a ratio (no dimension) not a duration. In that sense the expected result
should be a float, and the proposed operator will break the timedelta's
arithmetic consistence.

t, u, v <- timedeltas
t+u # valid
t / u # valid
t / u + v # invalid while all terms are valids

It's a big design flaw and I think it's the full answer to the original
question.

Le Jeudi 25 Mai 2006 02:26, Robert Kern a écrit :
> > what you want is :
> >
> > num_weeks = time_diff.days / 7
> > or
> > num_weeks = (time_diff / 7).days

>
> Uh, no. Besides the integer division problem in your first line, keep in
> mind that the .days attribute does not give you the time interval measured
> in days. It gives you the number of *whole* days in the interval. The first
> method will be incorrect if time_diff is not an even multiple of 1 day.
> The latter will be incorrect if time_diff is not an even multiple of 7 days.

In fact i was computing the exact number of whole weeks in the delta. In
respect of that both expression are perfectly correct, but the second one
isn't clear IMO (why this "days" attribute should give me the number of
weeks ?).

This said it's not hard to figure out the correct expression of the decimal
value of weeks in deltas (discarding the microseconds which are not
relevant) :
num_weeks = (time_diff.days * 24* 3600 + time_diff.seconds) / (7.*24*3600)

If I need to do much of these in a piece of code I would probably define some
helper functions like this :

def tomicroseconds(td) :
********return td.days * 24* 3600 * 10**6 +
**************** * td.seconds * 10 ** 6 + td.microseconds

def toseconds(td) : return float(tomicroseonds(td)) / 10 ** 6
tominute, tohours, todays, toweeks, etc...

and use float and int / and % operators.
This is an easy and clean implementation IMHO.

--
_____________

Maric Michaud
_____________

Aristote - www.aristote.info
3 place des tapis
69004 Lyon
Tel: +33 426 880 097
 
Reply With Quote
 
webograph
Guest
Posts: n/a
 
      04-27-2008
On Thu, 25 May 2006, maric wrote:
> > The ratio of two durations has no meaning???

> Oh, sorry, sure it has, I wanted to say "it has no meaning in timedelta provided arithmetic".
> It's a ratio (no dimension) not a duration. In that sense the expected result should be a float, and the proposed operator will break the timedelta's arithmetic consistence.
>
> t, u, v <- timedeltas
> t+u # valid
> t / u # valid
> t / u + v # invalid while all terms are valids
>

why is this a problem? not every structure has to form a closed
mathematical field, and there are other cases in which dividing similar
values yields another structure (think of calculating `factor =
speed2/speed1; distance2 = factor * distance1`)

is there any hope this can be fixed? defining timedelta/timedelta
division could not break existing code because no such division is
defined yet.

> num_weeks = (time_diff.days * 24* 3600 + time_diff.seconds) / (7.*24*3600)

this requires domain knowledge i'd expect a time structure to provide!
as you can create a timedelta by timedelta(seconds=1234567), i think it
is not too much to ask to have some simple way to get back the 1234567
seconds without thinking about what intervals (currently days, seconds
and microseconds) are used internally.

sorry for bringing up such an old thread, but this seems important to me
-- up to now, there are thousands [1] of python programs that use
hardcoded time calculations.


regards
webograph


[1]
http://www.google.com/codesearch?q=60|3600+24+timedelta+lang%3Apython
(gave me about 2000)
 
Reply With Quote
 
Martin v. Löwis
Guest
Posts: n/a
 
      04-27-2008
> sorry for bringing up such an old thread, but this seems important to me
> -- up to now, there are thousands [1] of python programs that use
> hardcoded time calculations.


Would you like to work on a patch?

Regards,
Martin
 
Reply With Quote
 
castironpi@gmail.com
Guest
Posts: n/a
 
      04-27-2008
On Apr 26, 10:27*pm, Jon Ribbens <jon+use...@unequivocal.co.uk> wrote:
> On 2008-04-27, Martin v. Löwis <mar...@v.loewis.de> wrote:
>
> >> sorry for bringing up such an old thread, but this seems important to me
> >> -- up to now, there are thousands [1] of python programs that use
> >> hardcoded time calculations.

>
> > Would you like to work on a patch?

>
> Last time I brought up this sort of thing, it seemed fairly unanimous
> that the shortcomings of the datetime module were 'deliberate' and
> would not be fixed, patch or no patch.


I wanted to format strings with them. How does modulo a datetime
sound?
 
Reply With Quote
 
Martin v. Löwis
Guest
Posts: n/a
 
      04-27-2008
> Last time I brought up this sort of thing, it seemed fairly unanimous
> that the shortcomings of the datetime module were 'deliberate' and
> would not be fixed, patch or no patch.


Ok, so then if the answer to my question is "yes", the first step
should be to discuss it on python-dev.

Regards,
Martin
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
why why why why why Mr. SweatyFinger ASP .Net 4 12-21-2006 01:15 PM
findcontrol("PlaceHolderPrice") why why why why why why why why why why why Mr. SweatyFinger ASP .Net 2 12-02-2006 03:46 PM
Cisco 2611 and Cisco 1721 : Why , why , why ????? sam@nospam.org Cisco 10 05-01-2005 08:49 AM
Why, why, why??? =?Utf-8?B?VGltOjouLg==?= ASP .Net 6 01-27-2005 03:35 PM
Why Why Why You HAVE NO IDEA MCSE 31 04-24-2004 06:40 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57