semana obtener ingresar fecha calendario python datetime

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.