65

I do a calculation of average time, and I would like to display the resulted average without microseconds.

avg = sum(timedeltas, datetime.timedelta(0)) / len(timedeltas)
Flimm
  • 136,138
  • 45
  • 251
  • 267
Hobbestigrou
  • 1,777
  • 1
  • 13
  • 16
  • What is 'datetimes'... a list of timedeltas? If so, the sum returns a timedelta object including microseconds... so what's the problem? – tdelaney Aug 27 '13 at 17:42
  • `avg.strftime("%Y-%m-%d %H:%M:%S")`, but it will return string. – Lyncean Patel Apr 14 '17 at 02:53
  • @tdelaney I changed the name of the variable from `datetimes` to `timedeltas`, as I agree that it is meant to be a list of timedeltas – Flimm Aug 22 '23 at 09:07

7 Answers7

65

If it is just for the display, this idea works :

avgString = str(avg).split(".")[0]

The idea is to take only what is before the point. It will return 01:23:45 for 01:23:45.1235

sangorys
  • 1,161
  • 10
  • 16
63

Take the timedelta and remove its own microseconds, as microseconds and read-only attribute:

avg = sum(timedeltas, datetime.timedelta(0)) / len(timedeltas)
avg = avg - datetime.timedelta(microseconds=avg.microseconds)

You can make your own little function if it is a recurring need:

import datetime

def chop_microseconds(delta):
    return delta - datetime.timedelta(microseconds=delta.microseconds)

I have not found a better solution.

Flimm
  • 136,138
  • 45
  • 251
  • 267
Hobbestigrou
  • 1,777
  • 1
  • 13
  • 16
19

another option, given timedelta you can do:

avg = datetime.timedelta(seconds=math.ceil(avg.total_seconds()))

You can replace the math.ceil(), with math.round() or math.floor(), depending on the situation.

ldav1s
  • 15,885
  • 2
  • 53
  • 56
eran
  • 6,731
  • 6
  • 35
  • 52
10
c -= timedelta(microseconds=c.microseconds)
Rafal
  • 573
  • 5
  • 11
0

Given that timedelta only stores days, seconds and microseconds internally, you can construct a new timedelta without microseconds:

from datetime import timedelta
timedeltas = [
    timedelta(hours=1, minutes=5, seconds=30, microseconds=9999), 
    timedelta(minutes=35, seconds=17, microseconds=55), 
    timedelta(hours=2, minutes=17, seconds=3, microseconds=1234),
]
avg = sum(timedeltas, timedelta(0)) / len(timedeltas) # timedelta(0, 4756, 670429)
avg = timedelta(days=avg.days, seconds=avg.seconds) # timedelta(0, 4756)
Flimm
  • 136,138
  • 45
  • 251
  • 267
ldav1s
  • 15,885
  • 2
  • 53
  • 56
  • I don't know why this is downvoted, creating a new timedelta with the days and seconds explicitly from the old is not more or less hackish than subtracting the microseconds using another newly created timedelta. This is what I would do at least. – BjornW Feb 08 '21 at 12:28
0

I think this is the best way to get the last minutes without microseconds:

import time
import datetime
NOW = datetime.datetime.now()
LASTMINUTE =  NOW - datetime.timedelta(minutes=1, seconds = NOW.second, microseconds = NOW.microsecond)
-1

I found this to work for me:

start_time = datetime.now()
some_work()
end time = datetime.now()
print str(end_time - start_time)[:-3]

Output:

0:00:01.955

I thought about this after searching in https://docs.python.org/3.2/library/datetime.html#timedelta-objects

Hope this helps!

Eitan.k.
  • 23
  • 3
  • As mentioned in countless other threads here on stackoverflow, this is not a good idea, as (1) not all timedelta objects are displayed with 6 characters (see the 0 time delta) for the microssecond part and (2) this does not deal with any form of rounding. – Aydo Jan 27 '20 at 07:53