Convert timedelta to total seconds
Asked Answered
R

6

342

I have a time difference

import time
import datetime

time1 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
...
time2 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
diff = time2 - time1

Now, how do I find the total number of seconds that passed? diff.seconds doesn't count days. I could do:

diff.seconds + diff.days * 24 * 3600

Is there a built-in method for this?

Rocambole answered 2/4, 2011 at 8:11 Comment(3)
@RestRisiko - you're right. Still, it's useful to have the question on Stack Overflow, so the next time me, or someone else, Googles for it, he has a good answer as the top result.Rocambole
We can discuss alternative definitions of "good" later; please read my answer before you run away :)Deteriorate
There are multiple issues with computing time1, and diff in your code. To get the current utc time as a naive datetime object, use datetime.utcnow() instead. To understand why you should use UTC instead of the local time to find the difference see Find if 24 hrs have passed between datetimes - Python. time.monotonic() could be preferable to find elapsed time between events (instead of time.time() or datetime.utcnow()).Ropeway
A
628

Use timedelta.total_seconds().

>>> import datetime
>>> datetime.timedelta(seconds=24*60*60).total_seconds()
86400.0
Aberdeen answered 2/4, 2011 at 8:20 Comment(3)
If somebody still needs to be compatible with 2.6: See #3318848 for how to extend datetime.timedelta with the new method yourself.Cerberus
datetime.timedelta.total_seconds(time2-time1) in Python3.6Lulualaba
(time2-time1).total_seconds() in python 3Hauberk
D
12

You have a problem one way or the other with your datetime.datetime.fromtimestamp(time.mktime(time.gmtime())) expression.

(1) If all you need is the difference between two instants in seconds, the very simple time.time() does the job.

(2) If you are using those timestamps for other purposes, you need to consider what you are doing, because the result has a big smell all over it:

gmtime() returns a time tuple in UTC but mktime() expects a time tuple in local time.

I'm in Melbourne, Australia where the standard TZ is UTC+10, but daylight saving is still in force until tomorrow morning so it's UTC+11. When I executed the following, it was 2011-04-02T20:31 local time here ... UTC was 2011-04-02T09:31

>>> import time, datetime
>>> t1 = time.gmtime()
>>> t2 = time.mktime(t1)
>>> t3 = datetime.datetime.fromtimestamp(t2)
>>> print t0
1301735358.78
>>> print t1
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=9, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=0) ### this is UTC
>>> print t2
1301700663.0
>>> print t3
2011-04-02 10:31:03 ### this is UTC+1
>>> tt = time.time(); print tt
1301736663.88
>>> print datetime.datetime.now()
2011-04-02 20:31:03.882000 ### UTC+11, my local time
>>> print datetime.datetime(1970,1,1) + datetime.timedelta(seconds=tt)
2011-04-02 09:31:03.880000 ### UTC
>>> print time.localtime()
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=20, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=1) ### UTC+11, my local time

You'll notice that t3, the result of your expression is UTC+1, which appears to be UTC + (my local DST difference) ... not very meaningful. You should consider using datetime.datetime.utcnow() which won't jump by an hour when DST goes on/off and may give you more precision than time.time()

Deteriorate answered 2/4, 2011 at 9:58 Comment(1)
Thanks for the clarification. For the purpose I'm using right now, a difference of even a few hours every now and then isn't important, but I'll be sure to check this out in the future when I write something more meaningful.Rocambole
E
1

More compact way to get the difference between two datetime objects and then convert the difference into seconds is shown below (Python 3x):

from datetime import datetime
        
time1 = datetime.strftime('18 01 2021', '%d %m %Y')
    
time2 = datetime.strftime('19 01 2021', '%d %m %Y')

difference = time2 - time1

difference_in_seconds = difference.total_seconds()
Extravehicular answered 19/1, 2021 at 13:38 Comment(2)
This is no different to the 10 year old accepted answer.Cythera
Erm, the accepted answer does not use Python 3's time2 - time1 syntax, only the comments underneath it do. So it is a bit different...Hebbe
S
0

You also can divide a timedelta by another timedelta for a specific unit. As the documentation states:

timedelta.total_seconds()

Return the total number of seconds contained in the duration. Equivalent to td / timedelta(seconds=1). For interval units other than seconds, use the division form directly (e.g. td / timedelta(microseconds=1)).

Syndesmosis answered 25/7, 2023 at 22:8 Comment(0)
G
0

Python 3:

import datetime
start_time = datetime.datetime.now()
# do something
total_seconds = (datetime.datetime.now() - start_time).total_seconds()
Gingrich answered 4/12, 2023 at 11:48 Comment(0)
D
-7

You can use mx.DateTime module

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)
Diazotize answered 13/11, 2014 at 14:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.