2012-07-03 22 views
5

Situazione: Sto cercando di costruire un metodo semplice che accetta due numeri interi diversi che rappresentano due date diverse. 20120525 per il 25 maggio 2012 e 20120627 per il 26 giugno 2012 come esempio. Voglio che questo metodo restituisca un elenco di questi tipi interi che rappresentano tutti i giorni tra i due parametri di data.Come ottenere tutte le date (mese, giorno e anno) tra due date in python?

Domanda: Domanda: Posso ottenere suggerimenti su come eseguire questa operazione e su come gestire mesi di 28, 29, 30 o 31 giorni ciascuno. Penso di poterlo fare estraendo i numeri come numeri interi attraverso la divisione/modding dei poteri di 10, e quindi incrementando questi numeri come tali con le condizioni particolari sopra, ma sento che ci deve essere un modo più semplice per farlo.

risposta

19

Non è necessario reinventare la ruota. Basta analizzare le stringhe in oggetti datetime e lasciare pitone fare i calcoli per voi:

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') 

stampe

20120525 
20120526 
20120527 
… 
20120625 
20120626 
20120627 
+5

TIL dateutil.rrule. – DSM

2

Una soluzione alternativa senza utilizzare rrule va qui:

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')) 

uscita:

20150101 
20150102 
20150103 
<snip> 
20150205 
20150206 
0

È possibile utilizzare pandas.date_range,

import pandas 

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

che produrrebbe,

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')