Re: Why can't timedeltas be divided?
On 2008-04-27 19:28, Martin v. Löwis wrote: Post a patch to bugs.python.org, optionally also post a message referring to that patch to python-dev. i've created an issue at [1]. let's hope for the best! thanks for your support webograph [1] http://bugs.python.org/issue2706 -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
> i've had a look at the source code and written a small patch (attached; > contains a case in classical/floor division as well as truediv). > is there a defined escalation procedure from python-list to python-dev > or should i just send the suggestion+patch there? Post a patch to bugs.python.org, optionally also post a message referring to that patch to python-dev. Regards, Martin -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
> Well, http://bugs.python.org/issue1673409 seems very closely related. I can't see the relationship. This issue is about conversion methods, not about arithmetic. Regards, Martin -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
On 2008-04-27, webograph <[EMAIL PROTECTED]> wrote: > On 2008-04-27 14:18, Jon Ribbens wrote: >> Yes, that's where it was decided that the datetime module was fine >> that way it is and must not be changed. > could you give me some pointers to that discussion? Well, http://bugs.python.org/issue1673409 seems very closely related. As does the thread starting at http://mail.python.org/pipermail/python-dev/2007-March/071776.html > nevertheless, i fail to see such problems when dividing timedeltas -- > after all, `delta2 / 5 == delta1` works, so why should not `delta2 / > delta1 == 5`? I used very similar arguments for the changes I wanted, and they weren't appreciated ;-) -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
On 2008-04-27 14:18, Jon Ribbens wrote: Yes, that's where it was decided that the datetime module was fine that way it is and must not be changed. could you give me some pointers to that discussion? i found some discussion about interpretation as intervals [1], casting numbers to intervals [2] and vice versa (plus discussion of connection to unix timestamps) [3], and arithmetics of time/datetime and timedelta [4], on which i agree that those are problematic (some of those also touch the problem of time zones). nevertheless, i fail to see such problems when dividing timedeltas -- after all, `delta2 / 5 == delta1` works, so why should not `delta2 / delta1 == 5`? regards webograph [1] http://www.mail-archive.com/[EMAIL PROTECTED]/msg21629.html [2] http://mail.python.org/pipermail/python-dev/2002-March/020604.html [3] http://www.mailinglistarchive.com/[EMAIL PROTECTED]/msg12596.html [4] http://bugs.python.org/issue1118748 -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
On 2008-04-27, Martin v. Löwis <[EMAIL PROTECTED]> wrote: >> 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. Yes, that's where it was decided that the datetime module was fine that way it is and must not be changed. -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
On 2008-04-27 09:12, Martin v. Löwis wrote: 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. i've had a look at the source code and written a small patch (attached; contains a case in classical/floor division as well as truediv). is there a defined escalation procedure from python-list to python-dev or should i just send the suggestion+patch there? regards webograph ps: i hope the patch conforms to python c coding style (most of it is just copy/pasted and modified). Index: Modules/datetimemodule.c === --- Modules/datetimemodule.c (revision 62520) +++ Modules/datetimemodule.c (working copy) @@ -1656,6 +1656,30 @@ } static PyObject * +anydivide_timedelta_timedelta(PyDateTime_Delta *left, PyDateTime_Delta *right, PyObject* (*operator)(PyObject*, PyObject*)) +{ + PyObject *pyus_left; + PyObject *pyus_right; + PyObject *result; + + pyus_left = delta_to_microseconds(left); + if (pyus_left == NULL) + return NULL; + + pyus_right = delta_to_microseconds(right); + if (pyus_right == NULL) + { + Py_DECREF(pyus_left); + return NULL; + } + + result = operator(pyus_left, pyus_right); + Py_DECREF(pyus_left); + Py_DECREF(pyus_right); + return result; +} + +static PyObject * delta_add(PyObject *left, PyObject *right) { PyObject *result = Py_NotImplemented; @@ -1808,6 +1832,11 @@ result = divide_timedelta_int( (PyDateTime_Delta *)left, right); + if (PyDelta_Check(right)) + result = anydivide_timedelta_timedelta( + (PyDateTime_Delta *)left, + (PyDateTime_Delta *)right, + PyNumber_Divide); } if (result == Py_NotImplemented) @@ -1815,6 +1844,24 @@ return result; } +static PyObject * +delta_truedivide(PyObject *left, PyObject *right) +{ + PyObject *result = Py_NotImplemented; + + if (PyDelta_Check(left)) { + if (PyDelta_Check(right)) + result = anydivide_timedelta_timedelta( + (PyDateTime_Delta *)left, + (PyDateTime_Delta *)right, + PyNumber_TrueDivide); + } + + if (result == Py_NotImplemented) + Py_INCREF(result); + return result; +} + /* Fold in the value of the tag ("seconds", "weeks", etc) component of a * timedelta constructor. sofar is the # of microseconds accounted for * so far, and there are factor microseconds per current unit, the number @@ -2147,7 +2194,7 @@ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ delta_divide,/* nb_floor_divide */ - 0, /* nb_true_divide */ + delta_truedivide, /* nb_true_divide */ 0, /* nb_inplace_floor_divide */ 0, /* nb_inplace_true_divide */ }; -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
> 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 -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
On Apr 26, 10:27 pm, Jon Ribbens <[EMAIL PROTECTED]> wrote: > On 2008-04-27, Martin v. Löwis <[EMAIL PROTECTED]> 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? -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
On 2008-04-27, Martin v. Löwis <[EMAIL PROTECTED]> 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. -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
> 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 -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
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) -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
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 -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
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 -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
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??? -- http://mail.python.org/mailman/listinfo/python-list
Re: Why can't timedeltas be divided?
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 -- http://mail.python.org/mailman/listinfo/python-list
Why can't timedeltas be divided?
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) * 100 + 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? -- http://mail.python.org/mailman/listinfo/python-list