2011-09-01 24 views
97

Por ejemplo:Imprimir todas las fechas-día entre dos fechas

from datetime import date 

d1 = date(2008,8,15) 
d2 = date(2008,9,15) 

Busco código simple para imprimir todas las fechas en el medio:

2008,8,15 
2008,8,16 
2008,8,17 
... 
2008,9,14 
2008,9,15 

Gracias

+2

Tome un vistazo a http://stackoverflow.com/questions/1060279/iterating-through-a-range-of-dates-in-python –

+0

gracias, buscado anteriormente , pero no encontré esa publicación – zetah

Respuesta

175

Vine hasta con esto:

from datetime import date, timedelta 

d1 = date(2008, 8, 15) # start date 
d2 = date(2008, 9, 15) # end date 

delta = d2 - d1   # timedelta 

for i in range(delta.days + 1): 
    print(d1 + timedelta(days=i)) 

La salida:

2008-08-15 
2008-08-16 
... 
2008-09-13 
2008-09-14 
2008-09-15 

Su pregunta requiere fechas intermedias, pero creo que quiso incluir los puntos de inicio y fin, por lo que están incluidos. Para eliminar la fecha de finalización, elimine el +1 al final del ciclo for. Para eliminar la fecha de inicio, agregue un 1 al comienzo de la función de rango.

+0

Hola a todos, lo intenté pero imprime solo el último día, necesito la lista completa día fechas_lista = [] resultado = d1 + td (días = i) fechas_lista.append (resultado) imprimir (resultado) Imprime solo el último día, ¿cómo resolverlo? – PyDroid

+1

Parece que tu loop está mal de alguna manera. Responda con el valor de su 'rango (delta.days)'. –

0
import datetime 

begin = datetime.date(2008, 8, 15) 
end = datetime.date(2008, 9, 15) 

next_day = begin 
while True: 
    if next_day > end: 
     break 
    print next_day 
    next_day += datetime.timedelta(days=1) 
+0

Gracias, como ambas respuestas son correctas, marcaré primero – zetah

4
import datetime 

d1 = datetime.date(2008,8,15) 
d2 = datetime.date(2008,9,15) 
diff = d2 - d1 
for i in range(diff.days + 1): 
    print (d1 + datetime.timedelta(i)).isoformat() 
21

Usando una lista por comprensión:

from datetime import date, timedelta 

d1 = date(2008,8,15) 
d2 = date(2008,9,15) 

# this will give you a list containing all of the dates 
dd = [d1 + timedelta(days=x) for x in range((d2-d1).days + 1)] 

for d in dd: 
    print d 

# you can't join dates, so if you want to use join, you need to 
# cast to a string in the list comprehension: 
ddd = [str(d1 + timedelta(days=x)) for x in range((d2-d1).days + 1)] 
# now you can join 
print "\n".join(ddd) 
4

En esencia, el mismo que la respuesta de Gringo Suave, pero con un generador:

from datetime import datetime, timedelta 


def datetime_range(start=None, end=None): 
    span = end - start 
    for i in xrange(span.days + 1): 
     yield start + timedelta(days=i) 

continuación, puede utilizar la siguiente manera:

In: list(datetime_range(start=datetime(2014, 1, 1), end=datetime(2014, 1, 5))) 
Out: 
[datetime.datetime(2014, 1, 1, 0, 0), 
datetime.datetime(2014, 1, 2, 0, 0), 
datetime.datetime(2014, 1, 3, 0, 0), 
datetime.datetime(2014, 1, 4, 0, 0), 
datetime.datetime(2014, 1, 5, 0, 0)] 

O así:

In []: for date in datetime_range(start=datetime(2014, 1, 1), end=datetime(2014, 1, 5)): 
    ...:  print date 
    ...:  
2014-01-01 00:00:00 
2014-01-02 00:00:00 
2014-01-03 00:00:00 
2014-01-04 00:00:00 
2014-01-05 00:00:00 
+0

Prefiero la idea del generador, siempre puede ser una función auxiliar en algún lugar del código; Sin embargo, ciertamente carece de tipo y control de cordura. 'start' y' end' args predeterminados establecidos en None piden errores. –

Cuestiones relacionadas