How to calculate the time interval between two time strings

前端 未结 12 2608
生来不讨喜
生来不讨喜 2020-11-22 12:03

I have two times, a start and a stop time, in the format of 10:33:26 (HH:MM:SS). I need the difference between the two times. I\'ve been looking through documentation for

12条回答
  •  青春惊慌失措
    2020-11-22 12:49

    Here's a solution that supports finding the difference even if the end time is less than the start time (over midnight interval) such as 23:55:00-00:25:00 (a half an hour duration):

    #!/usr/bin/env python
    from datetime import datetime, time as datetime_time, timedelta
    
    def time_diff(start, end):
        if isinstance(start, datetime_time): # convert to datetime
            assert isinstance(end, datetime_time)
            start, end = [datetime.combine(datetime.min, t) for t in [start, end]]
        if start <= end: # e.g., 10:33:26-11:15:49
            return end - start
        else: # end < start e.g., 23:55:00-00:25:00
            end += timedelta(1) # +day
            assert end > start
            return end - start
    
    for time_range in ['10:33:26-11:15:49', '23:55:00-00:25:00']:
        s, e = [datetime.strptime(t, '%H:%M:%S') for t in time_range.split('-')]
        print(time_diff(s, e))
        assert time_diff(s, e) == time_diff(s.time(), e.time())
    

    Output

    0:42:23
    0:30:00
    

    time_diff() returns a timedelta object that you can pass (as a part of the sequence) to a mean() function directly e.g.:

    #!/usr/bin/env python
    from datetime import timedelta
    
    def mean(data, start=timedelta(0)):
        """Find arithmetic average."""
        return sum(data, start) / len(data)
    
    data = [timedelta(minutes=42, seconds=23), # 0:42:23
            timedelta(minutes=30)] # 0:30:00
    print(repr(mean(data)))
    # -> datetime.timedelta(0, 2171, 500000) # days, seconds, microseconds
    

    The mean() result is also timedelta() object that you can convert to seconds (td.total_seconds() method (since Python 2.7)), hours (td / timedelta(hours=1) (Python 3)), etc.

提交回复
热议问题