开发者

Adding up time durations in Python

开发者 https://www.devze.com 2022-12-22 21:18 出处:网络
I would like to add up a series of splits in Python. The times begin as strings like \"00:08:30.291\". I can\'t seem to find the right way to use the Python objects or API to make this convenient/eleg

I would like to add up a series of splits in Python. The times begin as strings like "00:08:30.291". I can't seem to find the right way to use the Python objects or API to make this convenient/elegant. It seems that the time object doesn't 开发者_JS百科use microseconds, so I'm using datetime's strptime to parse the strings, successfully. But then datetimes don't seem to add, and I really prefer not to overflow into days (i.e. 23 + 2 hours = 25 hours). I can use datetime.time but they don't add either. Timedeltas would seem appropriate but seem a little awkward to convert from/to other things. Perhaps I am missing something obvious here. I would like to be able to:

for timestring in times:
    t = datetime.strptime("%H:%M:%S.%f", timestring).time
    total_duration = total_duration + t
print total_duration.strftime("%H:%M:%S.%f")


What you're working with is time differences, that's why using datetime.timedelta is only appropriate here:

>>> import datetime
>>> d1 = datetime.datetime.strptime("00:08:30.291", "%H:%M:%S.%f")
>>> d1
datetime.datetime(1900, 1, 1, 0, 8, 30, 291000)
>>> d2
datetime.datetime(1900, 1, 1, 0, 2, 30, 291000)
>>> dt1 = datetime.timedelta(minutes=d1.minute, seconds=d1.second, microseconds=d1.microsecond)
>>> dt2 = datetime.timedelta(minutes=d2.minute, seconds=d2.second, microseconds=d2.microsecond)
>>> fin = dt1 + dt2
>>> fin
datetime.timedelta(0, 660, 582000)
>>> str(fin)
'0:11:00.582000'

Also, please don't use such names as sum for your variables, you're shadowing built-in.


import numpy as np

# read file with one duration per line
with open('clean_times.txt', 'r') as f:
    x = f.read()

# Convert string to list of '00:02:12.31'
# I had to drop last item (empty string)
tmp = x.split('\n')[:-1]

# get list of ['00', 02, '12.31']
tmp = [i.split(':') for i in tmp.copy()]

# create numpy array with floats
np_tmp = np.array(tmp, dtype=np.float)

# sum via columns and divide
# hours/24 minutes/60 milliseconds/1000
# X will be a float array [days, hours, seconds]
# Something like `array([ 0.        , 15.68333333,  7.4189    ])`
X = np_tmp.sum(axis=0) / np.array([24, 60, 1000])

I was hapy here, but if you need fancy string like '15:41:07.518' as output, continue reading

# X will be a float array [hours, hours, seconds]
X = np_tmp.sum(axis=0) / np.array([1, 60, 1000])

# ugly part
# Hours are integer parts
H = int(X[0]) + int(X[1])
# Minutes are  hour fractional part and integer minutes part
tmp_M = (X[0] % 1 + X[1] % 1) * 60
M = int(tmp_M)
# Seconds are minutes fractional part and integer seconds part
tmp_S = tmp_M % 1 * 60 + X[2]
S = int(tmp_S)
# Milliseconds are seconds fractional part
MS = int(tmp_S % 1 * 1000)

# merge string for output
# Something like '15:41:07.518'
result = f'{H:02}:{M:02}:{S:02}.{MS:03}'
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号