Quiero crear una lista de fechas, comenzando hoy, y retrocediendo un número arbitrario de días, digamos, en mi ejemplo, 100 días. ¿Hay una mejor manera de hacerlo que esto?
import datetime
a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
dateList.append(a - datetime.timedelta(days = x))
print dateList
range(0, numdays)
en este caso?datetimes = [start + timedelta(seconds=x*60+randint(-30, 30)) for x in range (0, range_end*5, 5)]
donde está la variablerange_end = 10
Pandas
es ideal para series temporales en general y tiene soporte directo para rangos de fechas.Por ejemplo
pd.date_range()
:También tiene muchas opciones para hacer la vida más fácil. Por ejemplo, si solo quisiera entre semana, simplemente cambiaría
bdate_range
.Ver documentación del rango de fechas
Además, es totalmente compatible con las zonas horarias pytz y puede abarcar sin problemas los cambios de horario de verano de primavera / otoño.
EDITAR por OP:
Si necesita fechas y horas reales de Python, a diferencia de las marcas de tiempo de Pandas:
Utiliza el parámetro "fin" para que coincida con la pregunta original, pero si desea fechas descendentes:
fuente
list(map(pd.Timestamp.to_pydatetime, datelist))
recuperar el tipo de fecha y hora ...pandas.datetime
clase está en desuso y se eliminará de los pandas en una versión futura. Importar desde eldatetime
módulo en su lugar.Obtenga un rango de fechas entre las fechas de inicio y finalización especificadas (Optimizado para la complejidad de tiempo y espacio):
fuente
(end-start+1)
no funciona, no puede agregar un timedelta e int. Sin(end-start).days + 1
embargo, podrías usar .Puede escribir una función generadora que devuelva objetos de fecha a partir de hoy:
Este generador devuelve fechas a partir de hoy y retrocede un día a la vez. Aquí es cómo tomar las primeras 3 fechas:
La ventaja de este enfoque sobre la comprensión de un bucle o lista es que puede regresar tantas veces como desee.
Editar
Una versión más compacta que usa una expresión generadora en lugar de una función:
Uso:
fuente
sí, reinventa la rueda ... solo busca en el foro y obtendrás algo como esto:
fuente
dateutil.rrule
implementa iCalendar RFC : es más fácil usar funciones con un comportamiento bien definido en lugar de múltiples implementaciones de casi la misma funcionalidad que son muy diferentes.dateutil.rrule
permite limitar la corrección de errores a un solo lugar.rrule
nombre no es arbitrario; es del rfc correspondienteTambién puede usar el ordinal de día para simplificarlo:
O como se sugiere en los comentarios, puede crear una lista como esta:
fuente
Por el título de esta pregunta esperaba encontrar algo así
range()
, que me permitiera especificar dos fechas y crear una lista con todas las fechas intermedias. De esa manera, no es necesario calcular el número de días entre esas dos fechas, si no se sabe de antemano.Entonces, con el riesgo de estar un poco fuera de tema, este one-liner hace el trabajo:
Todos los créditos a esta respuesta !
fuente
Aquí hay una respuesta ligeramente diferente a partir de la respuesta de S.Lott que da una lista de fechas entre dos fechas
start
yend
. En el siguiente ejemplo, desde principios de 2017 hasta hoy.fuente
Un poco de respuesta tardía, lo sé, pero tuve el mismo problema y decidí que la función de rango interno de Python era un poco escasa a este respecto, así que la he anulado en un módulo de utilidad mío.
fuente
output = []
y cambiar las líneas en elwhile cmp(...)
bucle. Compararange(0,10,1)
y_range(0,10,1)
.date_range
.En base a las respuestas, escribí para mí esto:
Salida:
La diferencia es que obtengo el
date
"objeto", no el "datetime.datetime
.fuente
Si hay dos fechas y necesita el rango intente
fuente
Aquí está la esencia que creé, desde mi propio código, esto podría ayudar. (Sé que la pregunta es demasiado antigua, pero otros pueden usarla)
https://gist.github.com/2287345
(lo mismo a continuación)
fuente
Aquí hay una línea para que los scripts de bash obtengan una lista de días de la semana, esto es python 3. Modificado fácilmente para lo que sea, el int al final es el número de días en el pasado que desea.
Aquí hay una variante para proporcionar una fecha de inicio (o más bien, finalización)
Aquí hay una variante para las fechas arbitrarias de inicio y finalización. No es que esto no sea terriblemente eficiente, pero es bueno para poner un bucle for en un script bash:
fuente
Matplotlib relacionados
fuente
Sé que esto ha sido respondido, pero escribiré mi respuesta con fines históricos, y dado que creo que es sencillo.
Claro que no ganará nada como code-golf, pero creo que es elegante.
fuente
arange
con los pasos es bastante bueno, perolistOfDates
consiste en numpy datetime64 en lugar de python datetime nativo.np.arange(…).astype(dt.datetime)
paraarange
devolver la fecha y hora de python nativa en lugar de numpy datetime64.Otro ejemplo que cuenta hacia adelante o hacia atrás, a partir de la respuesta de Sandeep.
da
y
da
Tenga en cuenta que la fecha de inicio está incluida en la declaración, por lo que si desea cuatro fechas totales, use
timedelta(days=3)
fuente
fuente
Un generador de rango de fechas mensual con
datetime
ydateutil
. Simple y fácil de entender:fuente
fuente
end
debería serbase - datetime.timedelta
. Además ... ¿Por qué esta solución es mejor que la original?De las respuestas anteriores, creé este ejemplo para el generador de fechas
fuente