Home > Net >  Python: from list of decimal to hours / minutes
Python: from list of decimal to hours / minutes

Time:11-11

I have a list like the following:

T = [10.749957462142994, 10.90579301143351, 10.981580990083001]

That contains timestamp in a decimal format

hours =  [ int(x) for x in T ]
minutes =[ (x*60) % 60 for x in T]

print("%d:d"%(hours[0], minutes[0]), "%d:d"%(hours[1], minutes[1]), "%d:d"%(hours[2], minutes[2]))
['10:44', '10:54', '10:58']

I would like to create a list of datetime without years-month-day but just hours and minutes.

I tried this

from datetime import datetime
DT = []
for i,t in enumerate(T):
    string = str("%d:d"%(hours[i], minutes[i]))
    datetime_object = datetime. strptime(string, '%H:%M')
    DT.append(datetime_object)

However DT looks like the following

DT
[datetime.datetime(1900, 1, 1, 10, 44),
 datetime.datetime(1900, 1, 1, 10, 54),
 datetime.datetime(1900, 1, 1, 10, 58)]

How can I remove the information of year, day and month and have something like:

DT
[datetime.datetime( 10, 44),
 datetime.datetime( 10, 54),
 datetime.datetime( 10, 58)]

CodePudding user response:

I've taken a slightly different approach:

from datetime import time, datetime, timedelta
T = [10.749957462142994, 10.90579301143351, 10.981580990083001]
values = [(datetime.min   timedelta(hours=t)).time() for t in T]

timedelta objects support arbitrary floats for the hours. The result is a rather simple 1 line of code.

CodePudding user response:

You can use datetime.time or if you really want to use datetime.datetime then you can get the time only with datatime.datetime.time() method.

CodePudding user response:

Here's a simple way to do it:

import datetime

DUMMY_DATETIME = datetime.datetime(2000, 1, 1, 0, 0)
HOUR = datetime.timedelta(hours=1)

T = [10.749957462142994, 10.90579301143351, 10.981580990083001]
DT = [(DUMMY_DATETIME   hours * HOUR).time() for hours in T]

A timedelta can be multiplied by a float (automatically rounding to microseconds), which lets you easily convert a fractional hours value into a timedelta, without having to manually do the multiplication/division/modulo by 60.

The date part (Y2K) of the DUMMY_DATETIME object is just there to make the operator work (because time timedelta is a TypeError, but datetime timedelta is fine). All that matters is the hours/minutes/seconds part being 0.

The expression DUMMY_DATETIME hours * HOUR thus gives a timestamp that's the specified number of hours after the epoch. And calling .time() on that object gives you the time, without the useless year/month/day part.

>>> DT
[datetime.time(10, 44, 59, 846864), datetime.time(10, 54, 20, 854841), datetime.time(10, 58, 53, 691564)]
>>> [t.strftime('%H:%M') for t in DT]
['10:44', '10:54', '10:58']
  • Related