Python: fechas de grupo en rangos de K

Dada una lista de fechas, agrupe las fechas en rangos de días sucesivos desde la fecha inicial de la lista. Formaremos un grupo de cada rango sucesivo de K fechas, empezando por la fecha más pequeña. 

Entrada: test_list = [datetime(2020, 1, 4), datetime(2019, 12, 30), datetime(2020, 1, 7), datetime(2019, 12, 27), datetime(2020, 1, 20), fechahora(2020, 1, 10)], K = 10

Salida: [(0, [datetime.datetime(2019, 12, 27, 0, 0), datetime.datetime(2019, 12, 30, 0, 0), datetime.datetime(2020, 1, 4, 0, 0 )]), (1, [fechahora.fechahora(2020, 1, 7, 0, 0), fechahora.fechahora(2020, 1, 10, 0, 0)]), (2, [fechahora.fechahora(2020, 1, 20, 0, 0)])]

Explicación: del 27 de diciembre al 4 de enero está en el mismo grupo que la diferencia. de fechas son inferiores a 10, sucesivamente, cada conjunto de fechas se agrupa por 10 días delta.

Entrada: test_list = [datetime(2020, 1, 4), datetime(2019, 12, 30), datetime(2020, 1, 7), datetime(2019, 12, 27), datetime(2020, 1, 20), fechahora(2020, 1, 10)], K = 14

Salida: [(0, [datetime.datetime(2019, 12, 27, 0, 0), datetime.datetime(2019, 12, 30, 0, 0), datetime.datetime(2020, 1, 4, 0, 0 ), datetime.datetime(2020, 1, 7, 0, 0)]), (1, [datetime.datetime(2020, 1, 10, 0, 0), datetime.datetime(2020, 1, 20, 0, 0)])]

Explicación: del 27 de diciembre al 7 de enero está en el mismo grupo que la diferencia. de fechas son inferiores a 14, sucesivamente, cada conjunto de fechas se agrupa por 14 días delta.

Método: Usando groupby() + sort()

En esto, ordenamos las fechas y luego realizamos la agrupación de un conjunto de fechas dependiendo de la función de agrupación. 

Python3

# Python3 code to demonstrate working of
# Group dates in K ranges
# Using groupby() + sort()
from itertools import groupby
from datetime import datetime
 
# initializing list
test_list = [datetime(2020, 1, 4),
             datetime(2019, 12, 30),
             datetime(2020, 1, 7),
             datetime(2019, 12, 27),
             datetime(2020, 1, 20),
             datetime(2020, 1, 10)]
              
# printing original list
print("The original list is : " + str(test_list))
 
# initializing K
K = 7
 
# initializing start date
min_date = min(test_list)
 
# utility fnc to form groupings
def group_util(date):
    return (date-min_date).days // K
 
# sorting before grouping
test_list.sort()
 
temp = []
# grouping by utility function to group by K days
for key, val in groupby(test_list , key = lambda date : group_util(date)):
    temp.append((key, list(val)))
 
# using strftime to convert to userfriendly
# format
res = []
for sub in temp:
  intr = []
  for ele in sub[1]:
    intr.append(ele.strftime("%Y/%m/%d"))
  res.append((sub[0], intr))
     
# printing result
print("Grouped Digits : " + str(res))

Producción:

La lista original es: [datetime.datetime(2020, 1, 4, 0, 0), datetime.datetime(2019, 12, 30, 0, 0), datetime.datetime(2020, 1, 7, 0, 0) , fechahora.fechahora(2019, 12, 27, 0, 0), fechahora.fechahora(2020, 1, 20, 0, 0), fechahora.fechahora(2020, 1, 10, 0, 0)]

Dígitos agrupados: [(0, [‘2019/12/27’, ‘2019/12/30’]), (1, [‘2020/01/04’, ‘2020/01/07’]), (2 , [‘2020/01/10’]), (3, [‘2020/01/20’])]

Publicación traducida automáticamente

Artículo escrito por manjeet_04 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *