Python generando una lista de fechas entre dos fechas

5 minutos de lectura

Quiero generar una lista de fechas entre dos fechas y almacenarlas en una lista en formato de cadena. Esta lista es útil para comparar con otras fechas que tengo.

Mi código se da a continuación:

from datetime import date, timedelta

sdate = date(2019,3,22)   # start date
edate = date(2019,4,9)   # end date

def dates_bwn_twodates(start_date, end_date):
    for n in range(int ((end_date - start_date).days)):
        yield start_date + timedelta(n)
print(dates_bwn_twodates(sdate,edate))

Mi salida actual:

<generator object dates_bwn_twodates at 0x000002A8E7929410>

Mi salida esperada:

['2019-03-22',.....,'2019-04-08']

Algo está mal en mi código.

  • Usando yield significa que su función devolverá un generador. Si desea ejecutar el generador para obtener todos los elementos, puede hacerlo print(list(dates_bwn_twodates(sdate, edate))).

    – Fiddle Stix

    23 de enero de 2020 a las 16:10


  • @anky_91 Necesito consejo. ¿Si quiero verificar si una fecha está en la lista anterior? ¿Cómo comparar con una lista?

    – Continente

    23 de enero de 2020 a las 16:13

  • @Mainland ¿Su objetivo es verificar si una fecha está entre otras dos fechas? Si es así, la lista es innecesaria y hay formas más simples de realizar esa verificación.

    – Alollz

    23 de enero de 2020 a las 16:16

  • @ALollz ¡Sí! el objetivo es tener una lista de fechas a mano (almacenadas en una lista) y comparar si una fecha ya está en la lista. Pensé que esta era la única manera. Agradezco cualquier solución alternativa.

    – Continente

    23 de enero de 2020 a las 16:20

  • @Mainland para su última pregunta que acaba de eliminar, esto podría hacerse: print(round(df["value"].min(), -2)) y print(round(df["value"].max(), -2) + 100)

    – Antón

    5 ene a las 22:57

avatar de usuario de anky
anky

Puedes usar pandas.date_range() para esto:

import pandas
pandas.date_range(sdate,edate-timedelta(days=1),freq='d')

DatetimeIndex(['2019-03-22', '2019-03-23', '2019-03-24', '2019-03-25',
           '2019-03-26', '2019-03-27', '2019-03-28', '2019-03-29',
           '2019-03-30', '2019-03-31', '2019-04-01', '2019-04-02',
           '2019-04-03', '2019-04-04', '2019-04-05', '2019-04-06',
           '2019-04-07', '2019-04-08'],
          dtype="datetime64[ns]", freq='D')

  • @anky Si quiero obtener una lista de fechas como [‘20190322’, ‘20190323’,…….], ¿qué hacer? Gracias 🙂

    – RS Juan

    19 de noviembre de 2021 a las 8:37


  • @RSJohn añadir .tolist() al final

    – anky

    19 de noviembre de 2021 a las 8:56

  • @anky En realidad, no quiero el guión (-) en el formato de fecha. Perdón por ser menos claro.

    – RS Juan

    19 de noviembre de 2021 a las 9:04

  • @RSJohn prueba .strftime('%Y%m%d').tolist() al final entonces. Básicamente, cree el formato de fecha según sus necesidades y luego conviértalo a la lista, documentos aquí: pandas.pydata.org/pandas-docs/stable/reference/api/…

    – anky

    19 de noviembre de 2021 a las 9:52


Su código reescrito como una lista de comprensión:

[sdate+timedelta(days=x) for x in range((edate-sdate).days)]

resultados:

[datetime.date(2019, 3, 22),
 datetime.date(2019, 3, 23),
 datetime.date(2019, 3, 24),
          :
 datetime.date(2019, 4, 7),
 datetime.date(2019, 4, 8)]

from datetime import date, timedelta

sdate = date(2019,3,22)   # start date
edate = date(2019,4,9)   # end date
date_modified=sdate
list=[sdate] 


while date_modified<edate:
    date_modified+=timedelta(days=nbDaysbtw2dates) 
    list.append(date_modified)

print(list) 

  • Por supuesto, necesita especificar nbDaysbtw2dates

    – floema7

    12 de enero de 2021 a las 23:46

Me sorprende que esta no sea una función estándar en el paquete de fecha y hora.

Aquí hay una función que hace lo que se solicita:

from datetime import timedelta

def date_range_list(start_date, end_date):
    # Return list of datetime.date objects between start_date and end_date (inclusive).
    date_list = []
    curr_date = start_date
    while curr_date <= end_date:
        date_list.append(curr_date)
        curr_date += timedelta(days=1)
    return date_list

Uso:

from datetime import date, timedelta

def date_range_list(start_date, end_date):
    # Return list of datetime.date objects between start_date and end_date (inclusive).
    date_list = []
    curr_date = start_date
    while curr_date <= end_date:
        date_list.append(curr_date)
        curr_date += timedelta(days=1)
    return date_list

start_date = datetime.date(year=2021, month=12, day=20)
stop_date = datetime.date(year=2021, month=12, day=25)
date_list = date_range_list(start_date, stop_date)

date_list

Producción:

[datetime.date(2021, 12, 20),
 datetime.date(2021, 12, 21),
 datetime.date(2021, 12, 22),
 datetime.date(2021, 12, 23),
 datetime.date(2021, 12, 24),
 datetime.date(2021, 12, 25)]

Debería convertirlo en una lista con cadenas explícitamente:

print([str(d) for d in dates_bwn_twodates(sdate,edate)])

avatar de usuario de ishaant
ishaant

Hay un enfoque mucho más simple y se puede usar simplemente modificando su código. Es como sigue;

from datetime import datetime, timedelta
from datetime import date


def date_bwn_two_dates(start_date, end_date):
    date_list = [] # The list where we want to store
    for i in range(int((end_date-start_date).days)+1): # Iterate between the range of dates
        year = (start_date+timedelta(i)).strftime("%Y") # Get the Year
        month = (start_date+timedelta(i)).strftime("%m") # Get the month
        date_a = (start_date+timedelta(i)).strftime("%d") # Get the day
        date_list.append([year, month, date_a]) # Append the Objects accquired
    return date_list # return the list


for i in date_bwn_two_dates(date(2020, 12, 1), date(2021, 12, 1)):
    print(i)

avatar de usuario de darkis
oscuros

Puede utilizar la biblioteca de momentos de https://github.com/zachwill/momento.git para hacerte la vida más fácil.

import moment

def dates_bwn_twodates(start_date, end_date):
    diff = abs(start_date.diff(end_date).days)
    
    for n in range(0,diff+1):
        yield start_date.strftime("%Y-%m-%d")
        start_date = (start_date).add(days=1)

sdate = moment.date('2019-03-22')   #start date
edate = moment.date('2019-04-09')   #end date  

y luego tienes opciones

dates = list(dates_bwn_twodates(sdate,edate)) #dates as a list

o puedes iterar

for date in dates_bwn_twodates(sdate,edate):
    #do something with each date

¿Ha sido útil esta solución?