obtener - ingresar fecha en python
¿Cómo iterar durante un intervalo de tiempo después de días, horas, semanas y meses en Python? (6)
Debe modificar esta línea para que esto funcione correctamente:
current_date = current_date.replace (year = current_date.year + carry, month = new_month, day = 1)
;)
¿Cómo puedo iterar durante un intervalo de tiempo después de días, horas, semanas o meses?
Algo como:
for date in foo(from_date, to_date, delta=HOURS):
print date
Donde foo es una función, devolviendo un iterador. He estado mirando el módulo de calendario, pero eso solo funciona para un año o mes específico, no entre fechas.
Enfoque de iteración de mes:
def months_between(date_start, date_end):
months = []
# Make sure start_date is smaller than end_date
if date_start > date_end:
tmp = date_start
date_start = date_end
date_end = tmp
tmp_date = date_start
while tmp_date.month <= date_end.month or tmp_date.year < date_end.year:
months.append(tmp_date) # Here you could do for example: months.append(datetime.datetime.strftime(tmp_date, "%b ''%y"))
if tmp_date.month == 12: # New year
tmp_date = datetime.date(tmp_date.year + 1, 1, 1)
else:
tmp_date = datetime.date(tmp_date.year, tmp_date.month + 1, 1)
return months
Más código pero funcionará bien con largos períodos de tiempo verificando que las fechas dadas estén en orden ...
Esta biblioteca proporciona una útil herramienta de calendario: mxDateTime , eso debería ser suficiente :)
No creo que haya un método en la biblioteca de Python, pero puede crear uno fácilmente usando el módulo de fecha y hora :
from datetime import date, datetime, timedelta
def datespan(startDate, endDate, delta=timedelta(days=1)):
currentDate = startDate
while currentDate < endDate:
yield currentDate
currentDate += delta
Entonces podrías usarlo así:
>>> for day in datespan(date(2007, 3, 30), date(2007, 4, 3),
>>> delta=timedelta(days=1)):
>>> print day
2007-03-30
2007-03-31
2007-04-01
2007-04-02
O, si desea hacer su delta más pequeño:
>>> for timestamp in datespan(datetime(2007, 3, 30, 15, 30),
>>> datetime(2007, 3, 30, 18, 35),
>>> delta=timedelta(hours=1)):
>>> print timestamp
2007-03-30 15:30:00
2007-03-30 16:30:00
2007-03-30 17:30:00
2007-03-30 18:30:00
Para iterar durante meses necesita una receta diferente, ya que timedeltas no puede expresar "un mes".
from datetime import date
def jump_by_month(start_date, end_date, month_step=1):
current_date = start_date
while current_date < end_date:
yield current_date
carry, new_month = divmod(current_date.month - 1 + month_step, 12)
new_month += 1
current_date = current_date.replace(year=current_date.year + carry,
month=new_month)
(NB: tienes que restar 1 del mes para la operación del módulo y luego agregarlo de nuevo a new_month
, ya que los meses en datetime.date
s comienzan en 1.)
Use dateutil y su implementación de rrule, así:
from dateutil import rrule
from datetime import datetime, timedelta
now = datetime.now()
hundredDaysLater = now + timedelta(days=100)
for dt in rrule.rrule(rrule.MONTHLY, dtstart=now, until=hundredDaysLater):
print dt
La salida es
2008-09-30 23:29:54
2008-10-30 23:29:54
2008-11-30 23:29:54
2008-12-30 23:29:54
Reemplace MENSUALMENTE con cualquiera de AÑO, MENSUALMENTE, SEMANALMENTE, DIARIAMENTE, HORAS, MINUTAS O SEGUNDAMENTE. Reemplace dtstart y hasta con el objeto datetime que desee.
Esta receta tiene la ventaja de funcionar en todos los casos, incluido MENSUALMENTE. La única advertencia que puedo encontrar es que si pasa un número de día que no existe en todos los meses, se salta esos meses.