¿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?
Respuesta
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']
+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
Puede probar dateutil, especialmente sus fetiches relativedelta y rrule.
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
podría editar la pregunta para incluir este código para que pueda leerse? – pwdyson
@nimmyliji: por lo que no está preguntando sobre las fechas recurrentes, sino sobre el formato de fecha. –
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
.
- 1. Usando PHP DateInterval para crear eventos recurrentes
- 2. fechas de partidos usando Python expresiones regulares
- 3. usando UIScrollView generando problemas
- 4. Generando .dll usando CMake
- 5. Generando permutaciones usando bash
- 6. Eventos recurrentes, consulta SQL
- 7. Generando X509Certificate usando bouncycastle X509v3CertificateBuilder
- 8. Restar fechas con Python
- 9. PayPal pagos recurrentes
- 10. Generando pdf-latex con script de python
- 11. Generando ruido 3D rápidamente en python
- 12. generando permutaciones con repeticiones en python
- 13. Generando equals/hashcode/toString usando la anotación
- 14. Generando XML usando SAX y Java
- 15. ¿Cuál es una buena estructura de datos para fechas periódicas o recurrentes?
- 16. Como restar fechas con Python
- 17. comparaciones de fechas de Python
- 18. Búsqueda de archivos recurrentes (PHP)
- 19. Cómo calcular los dígitos recurrentes?
- 20. Paypal pagos recurrentes IPN confirmación
- 21. permitiendo fechas inválidas en python datetime
- 22. generando licenses.licx
- 23. Días entre dos fechas en Python
- 24. Django i18n y Python locales (y fechas)
- 25. Diferencia entre dos fechas en Python
- 26. ¿Cómo restar dos fechas en Django/Python?
- 27. ¿Cómo crear eventos recurrentes de calendario?
- 28. Cálculo de fechas relativas usando asp.net mvc
- 29. Probando pagos recurrentes (IPN de Paypal)
- 30. ¿Cómo integrar Paypal IPN para pagos recurrentes?
¿Qué código ha escrito hasta ahora? Por favor, publique el código que ha escrito. –