2009-08-24 5 views
3

Supposons que j'ai 2 intervalles de temps, tels que 16:30 - 20:00 et 15:00 - 19:00, j'ai besoin de trouver le temps total entre ces deux intervalles de sorte que le résultat est de 5 heures (J'ajoute les deux intervalles et soustraire l'intervalle d'intersection), comment puis-je écrire une fonction générique qui traite aussi tous les cas comme un intervalle dans l'autre (donc le résultat est l'intervalle du plus grand), donc le résultat est la somme des deux intervalles).python intervalle de temps algorithme somme

Ma structure de données entrantes est primitive, il suffit de la chaîne comme "15:30", donc une conversion peut être nécessaire.

Merci

Répondre

3
from datetime import datetime, timedelta 

START, END = xrange(2) 
def tparse(timestring): 
    return datetime.strptime(timestring, '%H:%M') 

def sum_intervals(intervals): 
    times = [] 
    for interval in intervals: 
     times.append((tparse(interval[START]), START)) 
     times.append((tparse(interval[END]), END)) 
    times.sort() 

    started = 0 
    result = timedelta() 
    for t, type in times: 
     if type == START: 
      if not started: 
       start_time = t 
      started += 1 
     elif type == END: 
      started -= 1 
      if not started: 
       result += (t - start_time) 
    return result 

test avec votre temps de la question:

intervals = [ 
       ('16:30', '20:00'), 
       ('15:00', '19:00'), 
      ] 
print sum_intervals(intervals) 

qui imprime:

5:00:00 

test ensemble avec des données qui ne se chevauchent pas

intervals = [ 
       ('16:30', '20:00'), 
       ('15:00', '19:00'), 
       ('03:00', '04:00'), 
       ('06:00', '08:00'), 
       ('07:30', '11:00'), 
      ] 
print sum_intervals(intervals) 

résultat :

11:00:00 
+0

ne fonctionne pas s'il n'y a pas un chevauchement. –

0

Je suppose que vous pouvez faire la conversion à quelque chose comme datetime sur votre propre.

Somme les deux intervalles, puis soustrayez tout chevauchement. Vous pouvez obtenir le chevauchement en comparant les valeurs min et max de chacune des deux plages.

0

Code pour quand il y a un chevauchement, s'il vous plaît ajouter à l'une de vos solutions:

def interval(i1, i2): 
    minstart, minend = [min(*e) for e in zip(i1, i2)] 
    maxstart, maxend = [max(*e) for e in zip(i1, i2)] 

    if minend < maxstart: # no overlap 
     return minend-minstart + maxend-maxstart 
    else: # overlap 
     return maxend-minstart 
0

Vous voulez convertir vos chaînes en datetimes. Vous pouvez le faire avec datetime.datetime.strptime.

intervalles donnés de datetime.datetime objets, si les intervalles sont les suivants:

int1 = (start1, end1) 
int2 = (start2, end2) 

est pas Ensuite, il suffit:

if end1 < start2 or end2 < start1: 
    # The intervals are disjoint. 
    return (end1-start1) + (end2-start2) 
else: 
    return max(end1, end2) - min(start1, start2) 
Questions connexes