Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I convert datetime.timedelta to minutes, hours in Python?

Tags:

python

django

I get a start_date like this:

from django.utils.timezone import utc import datetime  start_date = datetime.datetime.utcnow().replace(tzinfo=utc) end_date = datetime.datetime.utcnow().replace(tzinfo=utc) duration = end_date - start_date 

I get output like this:

datetime.timedelta(0, 5, 41038) 

How do I convert this into normal time like the following?

10 minutes, 1 hour like this

like image 968
user1881957 Avatar asked Jan 07 '13 04:01

user1881957


People also ask

What does Timedelta do in Python?

timedelta() function. Python timedelta() function is present under datetime library which is generally used for calculating differences in dates and also can be used for date manipulations in Python. It is one of the easiest ways to perform date manipulations.


1 Answers

There's no built-in formatter for timedelta objects, but it's pretty easy to do it yourself:

days, seconds = duration.days, duration.seconds hours = days * 24 + seconds // 3600 minutes = (seconds % 3600) // 60 seconds = seconds % 60 

Or, equivalently, if you're in Python 2.7+ or 3.2+:

seconds = duration.total_seconds() hours = seconds // 3600 minutes = (seconds % 3600) // 60 seconds = seconds % 60 

Now you can print it however you want:

'{} minutes, {} hours'.format(minutes, hours) 

For example:

def convert_timedelta(duration):     days, seconds = duration.days, duration.seconds     hours = days * 24 + seconds // 3600     minutes = (seconds % 3600) // 60     seconds = (seconds % 60)     return hours, minutes, seconds td = datetime.timedelta(2, 7743, 12345) hours, minutes, seconds = convert_timedelta(td) print '{} minutes, {} hours'.format(minutes, hours) 

This will print:

9 minutes, 50 hours 

If you want to get "10 minutes, 1 hour" instead of "10 minutes, 1 hours", you need to do that manually too:

print '{} minute{}, {} hour{}'.format(minutes, 's' if minutes != 1 else '',                                       hours, 's' if minutes != 1 else '') 

Or you may want to write an english_plural function to do the 's' bits for you, instead of repeating yourself.

From your comments, it sounds like you actually want to keep the days separate. That's even easier:

def convert_timedelta(duration):     days, seconds = duration.days, duration.seconds     hours = seconds // 3600     minutes = (seconds % 3600) // 60     seconds = (seconds % 60)     return days, hours, minutes, seconds 

If you want to convert this to a single value to store in a database, then convert that single value back to format it, do this:

def dhms_to_seconds(days, hours, minutes, seconds):     return (((days * 24) + hours) * 60 + minutes) * 60 + seconds  def seconds_to_dhms(seconds):     days = seconds // (3600 * 24)     hours = (seconds // 3600) % 24     minutes = (seconds // 60) % 60     seconds = seconds % 60     return days, hours, minutes, seconds 

So, putting it together:

def store_timedelta_in_database(thingy, duration):     seconds = dhms_to_seconds(*convert_timedelta(duration))     db.execute('INSERT INTO foo (thingy, duration) VALUES (?, ?)',                thingy, seconds)     db.commit()  def print_timedelta_from_database(thingy):     cur = db.execute('SELECT duration FROM foo WHERE thingy = ?', thingy)     seconds = int(cur.fetchone()[0])     days, hours, minutes, seconds = seconds_to_dhms(seconds)     print '{} took {} minutes, {} hours, {} days'.format(thingy, minutes, hours, days) 
like image 130
abarnert Avatar answered Sep 22 '22 03:09

abarnert