Tengo el siguiente código para hacer esto, pero ¿cómo puedo hacerlo mejor? En este momento creo que es mejor que los bucles anidados, pero comienza a obtener Perl-one-linerish cuando tienes un generador en una lista de comprensión.
day_count = (end_date - start_date).days + 1
for single_date in [d for d in (start_date + timedelta(n) for n in range(day_count)) if d <= end_date]:
print strftime("%Y-%m-%d", single_date.timetuple())
Notas
- En realidad no estoy usando esto para imprimir. Eso es solo para fines de demostración.
- Las variables
start_date
yend_date
sondatetime.date
objetos porque no necesito las marcas de tiempo. (Se usarán para generar un informe).
Salida de muestra
Para una fecha de inicio 2009-05-30
y una fecha de finalización de 2009-06-09
:
2009-05-30
2009-05-31
2009-06-01
2009-06-02
2009-06-03
2009-06-04
2009-06-05
2009-06-06
2009-06-07
2009-06-08
2009-06-09
Respuestas:
¿Por qué hay dos iteraciones anidadas? Para mí, produce la misma lista de datos con solo una iteración:
Y no se almacena ninguna lista, solo se repite un generador. También el "si" en el generador parece ser innecesario.
Después de todo, una secuencia lineal solo debería requerir un iterador, no dos.
Actualización después de la discusión con John Machin:
Quizás la solución más elegante es usar una función de generador para ocultar / abstraer completamente la iteración en el rango de fechas:
Nota: para mantener la coherencia con la
range()
función integrada, esta iteración se detiene antes de llegar aend_date
. Entonces, para una iteración inclusiva, use al día siguiente, como lo haría conrange()
.fuente
(start_date + datetime.timedelta(n) for n in range((end_date - start_date).days))
Esto podría ser más claro:
fuente
Usa la
dateutil
biblioteca:Esta biblioteca de Python tiene muchas características más avanzadas, algunas muy útiles, como
relative delta
s, y se implementa como un solo archivo (módulo) que se incluye fácilmente en un proyecto.fuente
until
que la fecha final deldaterange
método en la respuesta de Ber es exclusiva deend_date
.Pandas es ideal para series temporales en general y tiene soporte directo para rangos de fechas.
Luego puede recorrer el rango de fechas para imprimir la fecha:
También tiene muchas opciones para hacer la vida más fácil. Por ejemplo, si solo quisiera entre semana, simplemente cambiaría en bdate_range. Ver http://pandas.pydata.org/pandas-docs/stable/timeseries.html#generating-ranges-of-timestamps
El poder de Pandas es realmente sus marcos de datos, que admiten operaciones vectorizadas (al igual que numpy) que hacen que las operaciones en grandes cantidades de datos sean muy rápidas y fáciles.
EDITAR: También puede omitir por completo el bucle for y simplemente imprimirlo directamente, lo que es más fácil y más eficiente:
fuente
Esta función hace más de lo que estrictamente requiere, al admitir pasos negativos, etc. Siempre y cuando tenga en cuenta su lógica de rango, entonces no necesita
day_count
el código separado y, lo más importante, el código se vuelve más fácil de leer cuando llama a la función desde múltiples lugares.fuente
Esta es la solución más legible para los humanos que se me ocurre.
fuente
¿Por qué no intentarlo?
fuente
La
arange
función de Numpy se puede aplicar a las fechas:El uso de
astype
es convertir denumpy.datetime64
a una matriz dedatetime.datetime
objetos.fuente
dates = np.arange(d0, d1, dt).astype(datetime.datetime)
Mostrar los últimos n días a partir de hoy:
Salida:
fuente
print((datetime.date.today() + datetime.timedelta(i)).isoformat())
print((datetime.date.today() + datetime.timedelta(i)))
sin .isoformat () da exactamente la misma salida. Necesito mi script para imprimir YYMMDD. ¿Alguien sabe cómo hacer eso?d = datetime.date.today() + datetime.timedelta(i); d.strftime("%Y%m%d")
fuente
fuente
Para completar, Pandas también tiene una
period_range
función para las marcas de tiempo que están fuera de los límites:fuente
Tengo un problema similar, pero necesito iterar mensualmente en lugar de diariamente.
Esta es mi solucion
Ejemplo 1
Salida
Ejemplo # 2
Salida
fuente
Puede
't* creer que esta pregunta ha existido desde hace 9 años sin que nadie lo que sugiere una función recursiva simple:Salida:
Editar: * Ahora puedo creerlo, vea ¿Python optimiza la recursividad de la cola? . Gracias Tim .
fuente
Puede generar una serie de fechas entre dos fechas usando la biblioteca de pandas de manera simple y confiable
Puede cambiar la frecuencia de generación de fechas configurando la frecuencia como D, M, Q, Y (diaria, mensual, trimestral, anual)
fuente
fuente
Esta función tiene algunas características adicionales:
comprobación de errores en caso de que el final sea anterior al inicio
fuente
Aquí hay un código para una función de rango de fecha general, similar a la respuesta de Ber, pero más flexible:
fuente
¿Qué pasa con lo siguiente para hacer un rango incrementado en días?
Para una versión genérica:
Tenga en cuenta que .total_seconds () solo es compatible después de python 2.7. Si tiene una versión anterior, puede escribir su propia función:
fuente
Enfoque ligeramente diferente a los pasos reversibles almacenando
range
args en una tupla.fuente
SALIDA:
fuente