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.
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
-
-
@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)])
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)
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
Usando
yield
significa que su función devolverá un generador. Si desea ejecutar el generador para obtener todos los elementos, puede hacerloprint(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))
yprint(round(df["value"].max(), -2) + 100)
– Antón
5 ene a las 22:57