2010-02-19 14 views
16

¿Cómo puedo generar fechas recurrentes usando Python? Por ejemplo, quiero generar una fecha recurrente para "Tercer viernes de cada segundo mes". Quiero generar fechas recurrentes para diario, semanal, mensual, anual (es decir, igual que la función de recurrencia en Outlook Express).Generando fechas recurrentes usando Python?

+1

¿Qué código ha escrito hasta ahora? Por favor, publique el código que ha escrito. –

Respuesta

24
import dateutil.rrule as dr 
import dateutil.parser as dp 
import dateutil.relativedelta as drel 

start=dp.parse("19/02/2010") # Third Friday in Feb 2010 

Esto genera el tercer viernes de cada mes

rr = dr.rrule(dr.MONTHLY,byweekday=drel.FR(3),dtstart=start, count=10) 

Esto imprime cada tercer viernes:

print map(str,rr) 
# ['2010-02-19 00:00:00', '2010-03-19 00:00:00', '2010-04-16 00:00:00', '2010-05-21 00:00:00', '2010-06-18 00:00:00', '2010-07-16 00:00:00', '2010-08-20 00:00:00', '2010-09-17 00:00:00', '2010-10-15 00:00:00', '2010-11-19 00:00:00'] 

rr es un iterable, para que pueda utilizar rebanar la notación de seleccionar cada otro item. Esto imprime el tercer viernes de cada dos meses:

print map(str,rr[::2]) 
# ['2010-02-19 00:00:00', '2010-04-16 00:00:00', '2010-06-18 00:00:00', '2010-08-20 00:00:00', '2010-10-15 00:00:00'] 

arriba, utilicé str embellecer la salida un poco. Para obtener un formato de fecha de cadenas más flexible, use strftime: consulte http://au2.php.net/strftime o la página de manual de strftime para conocer todas las opciones.

print [d.strftime('%d/%m/%Y') for d in rr[::2]] 
# ['19/02/2010', '16/04/2010', '18/06/2010', '20/08/2010', '15/10/2010'] 
+0

+1 porque descaradamente usé su excelente ejemplo para responder esta pregunta SO muy similar: http://stackoverflow.com/questions/3099007/date-library-capable-of-calculating-things-like-every-third-tuesday – bernie

0

Puede probar dateutil, especialmente sus fetiches relativedelta y rrule.

+0

uso el siguiente código: lista de impresión (RRULE (diario, count = 10, dtstart = parse ("19/02/2010"))) El hacia fuera puesto es el siguiente aspecto: [datetime.datetime (2010, 2, 19, 0, 0), datetime.datetime (2010, 2, 20, 0, 0), datetime.datetime (2010, 2, 21, 0, 0), datetime.datetime (2010, 2, 22) , 0, 0), datetime.datetime (2010, 2, 23, 0, 0), datetime.datetime (2010, 2, 24, 0, 0), datetime.datetime (2010, 2, 25, 0, 0) , datetime.datetime (2010, 2, 26, 0, 0), datetime.datetime (2010, 2, 27, 0, 0), datetime.datetime (2010, 2, 28, 0, 0)] Pero yo quiere la salida como: 19/02/2010 20/02/2010 21/02/2010 . . . ¿Se puede cambiar? – Nimmy

+0

podría editar la pregunta para incluir este código para que pueda leerse? – pwdyson

+0

@nimmyliji: por lo que no está preguntando sobre las fechas recurrentes, sino sobre el formato de fecha. –

0

puede tratar de escribir esto usted mismo. primero tendrá un iterador que genera fechas separadas por un intervalo dado:

import datetime 

def dateiter(start, resolution): 
    date = start 
    while True: 
      yield date 
      date += resolution 

ahora, puede generar fechas y filtrarlos:

# generate a list of every tuesday of february 
# this iterates over every day from now, and filtered according to the rules 
# warning: infinite generator below, there is nothing to end the iteration 
tuesdays_of_february = (date for date in dateiter(datetime.datetime.now(), datetime.timedelta(days=1)) if date.weekday() == 4 and date.month == 2) 

puede llamar al iterador a sí mismo hasta que haya suficientes fechas :

>>> next(tuesdays_of_february) 
datetime.datetime(2010, 2, 19, 14, 25, 46, 171000) 

ahora, es necesario para limitar los resultados:

>>> from itertools import * 
>>> 
>>> # get the five next valid dates: 
>>> list(islice(tuesdays_of_february),5) 
[datetime.datetime(2010, 2,26, 14, 25, 46, 171000), datetime.datetime(2011, 2, 4 
, 14, 25, 46, 171000), datetime.datetime(2011, 2, 11, 14, 25, 46, 171000), datet 
ime.datetime(2011, 2, 18, 1 4, 25, 46, 171000), datetime.datetime(2011, 2, 25 
, 14, 25, 46, 171000)] 
>>> 
>>> # or until a condition is met: 
>>> list(takewhile(lambda date: date.year < 2014, tuesdays_of_february)) 
[datetime.datetime(2012, 2, 3, 14, 25, 46, 171000), datetime.datetime(2012, 2, 1 
0, 14, 25, 46, 171000), datetime.datetime(2012, 2, 17, 14, 25, 46, 171000), date 
time.datetime(2012, 2, 24, 14, 25, 46, 171000), datetime.datetime(2013, 2, 1, 14 
, 25, 46, 171000), datetime.datetime(2013, 2, 8, 14, 25, 46, 171000), datetime.d 
atetime(2013, 2, 15, 14, 25, 46, 171000), datetime.datetime(2013, 2, 22, 14, 25, 
46, 171000)] 

no olvide echar un vistazo a la documentación del módulo datetime.