2012-07-03 18 views
5

Situación: Estoy intentando construir un método simple que acepte dos enteros diferentes que representen dos fechas diferentes. 20120525 para el 25 de mayo de 2012 y 20120627 para el 26 de junio de 2012 como un ejemplo. Quiero que este método devuelva una lista de estos tipos enteros que representan todos los días entre los dos parámetros de fecha.¿Cómo obtener todas las fechas (mes, día y año) entre dos fechas en python?

Pregunta: ¿Podría obtener alguna sugerencia sobre cómo hacer esto y cómo manejar meses de 28, 29, 30 o 31 días en cada uno? Creo que puedo hacer esto extrayendo los números como enteros a través de la división/modding de potencias de 10, y luego incrementando estos números como tal con las condiciones particulares anteriores, pero siento que debe haber una manera más fácil de hacer esto.

Respuesta

19

No tiene que reinventar la rueda. Sólo analizar las cadenas en objetos de fecha y hora y dejar pitón hacer los cálculos para usted:

from dateutil import rrule 
from datetime import datetime 

a = '20120525' 
b = '20120627' 

for dt in rrule.rrule(rrule.DAILY, 
         dtstart=datetime.strptime(a, '%Y%m%d'), 
         until=datetime.strptime(b, '%Y%m%d')): 
    print dt.strftime('%Y%m%d') 

impresiones

20120525 
20120526 
20120527 
… 
20120625 
20120626 
20120627 
+5

TIL dateutil.rrule. – DSM

2

Una solución alternativa sin utilizar rrule va aquí:

import datetime 

d1 = datetime.date(2015, 1, 1) 
d2 = datetime.date(2015, 2, 6) 
days = [d1 + datetime.timedelta(days=x) for x in range((d2-d1).days + 1)] 

for day in days: 
    print(day.strftime('%Y%m%d')) 

Salida:

20150101 
20150102 
20150103 
<snip> 
20150205 
20150206 
0

Puede utilizar pandas.date_range,

import pandas 

pd.date_range('2012-05-25', '2012-06-27', freq='D') 

que produciría,

DatetimeIndex(['2012-05-25', '2012-05-26', '2012-05-27', '2012-05-28', 
       '2012-05-29', '2012-05-30', '2012-05-31', '2012-06-01', 
       ... 
       '2012-06-22', '2012-06-23', '2012-06-24', '2012-06-25', 
       '2012-06-26', '2012-06-27'], 
       dtype='datetime64[ns]', freq='D') 
Cuestiones relacionadas