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.
Debería convertirlo en una lista con cadenas explícitamente:
print([str(d) for d in dates_bwn_twodates(sdate,edate)])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')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)Puede usar la biblioteca de momentos de https://github.com/zachwill/moment.git para hacer su 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 datey luego tienes opciones
dates = list(dates_bwn_twodates(sdate,edate)) #dates as a listo puedes iterar
for date in dates_bwn_twodates(sdate,edate): #do something with each dateSu 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)]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_listUso:
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_listProducció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)]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)