[Python-Dev] datetime and timedelta enhancement (original) (raw)

Victor Stinner victor.stinner at haypocalc.com
Fri Nov 14 23:59:03 CET 2008


Hi,

There are some interresting tickets about the datetime module: #1673409: datetime module missing some important methods #1083: Confusing error message when dividing timedelta using / #2706: datetime: define division timedelta/timedelta #4291: Allow Division of datetime.timedelta Objects

Wanted features: 1- convert a datetime object to an epoch value (numbers of seconds since the 1st january 1970), eg. with a new totimestamp() method 2- convert a timedelta to a specific unit (eg. seconds, days, weeks, etc.) 3- compute the ratio of two timedelta, eg. for a progress bar

--

About (1), no patch is available yet. Some points are not fixed yet: a- use an integer to avoid floating point problems? b- use a float to keep the microseconds? c- limit the datetime to the time_t type (32 bits signed integer)? Which mean the following range:

from datetime import datetime, timedelta t0 = datetime(1970, 1, 1, 0, 0, 0) print t0 + timedelta(seconds=-231), "-", t0 + timedelta(seconds=231-1) 1901-12-13 20:45:52 - 2038-01-19 03:14:07

The following point may answer to questions (a) and (b)...

--

For the points (2) and (3): webograph and belopolsky proposed to use the division of two timedelta objects. Examples (using the patch attached to #2706):

from future import division from datetime import datetime, timedelta onesecond = timedelta(seconds=1) print timedelta(hours=1, minutes=1, microseconds=3) / onesecond 3660.000003 print timedelta(hours=1, minutes=1, microseconds=3) // onesecond 3660 print divmod(timedelta(hours=1, minutes=1, microseconds=3), onesecond) (3660L, datetime.timedelta(0, 0, 3))

We have the float representation, the integer part of the division, and the integer part + the remainder as a timedelta object. You have the choice to use the best format for your needs :)

Use another denominator to get other units, eg. weeks = dt / timedelta(days=7)

Then come the question of the accepted types: timedelta / float? divmod(timedelta, int)? etc.

--

About the conversion of a datetime object to time_t, the division can be reused like that:

epoch = datetime.fromtimestamp(0) print epoch 1970-01-01 01:00:00 d = datetime.fromtimestamp(34930.5) (d - epoch) / timedelta(seconds=1) # integer 34930.5 (d - epoch) // timedelta(seconds=1) # float 34930L

datetime.totimestamp() can be implemented to produce a float in range [-231; 231-1]. Why a float? To be symetric with fromtimestamp()! If you need older/newer timestamp or you want integers, use the examples with the divison.

-- Victor Stinner aka haypo http://www.haypocalc.com/blog/



More information about the Python-Dev mailing list