Python: divide el rango de fechas en N de igual duración

Dadas dos fechas, la tarea es dividirlas en tiempos de igual duración y obtener el tiempo exacto de cada punto de división.

Entrada: test_date1 = datetime.datetime(1997, 1, 4), test_date2 = datetime.datetime(1997, 1, 30) N = 7

Salida: [datetime.datetime(1997, 1, 4, 0, 0), datetime.datetime(1997, 1, 7, 17, 8, 34, 285714), datetime.datetime(1997, 1, 11, 10, 17 , 8, 571428), datetime.datetime(1997, 1, 15, 3, 25, 42, 857142), datetime.datetime(1997, 1, 18, 20, 34, 17, 142856), datetime.datetime(1997, 1, 22, 13, 42, 51, 428570), fechahora.fechahora(1997, 1, 26, 6, 51, 25, 714284)]

Explicación: se devuelve una lista de fechas de tamaño 7 y cada fecha tiene el mismo delta entre ellas.

Entrada: test_date1 = datetime.datetime(1997, 1, 4), test_date2 = datetime.datetime(1997, 1, 30) N = 4

Salida: [datetime.datetime(1997, 1, 4, 0, 0), datetime.datetime(1997, 1, 10, 12, 0), datetime.datetime(1997, 1, 17, 0, 0), datetime. fechahora(1997, 1, 23, 12, 0)]

Explicación: se devuelve una lista de fechas de tamaño 4 y cada fecha tiene el mismo delta entre ellas.

Método #1: Usar bucle

En esto, calculamos la duración de cada segmento usando la división de la duración total por N. Publica eso, cada fecha se construye usando la multiplicación de la duración del segmento en bucle.

Python3

# Python3 code to demonstrate working of
# Convert date range to N equal durations
# Using loop
import datetime
  
# initializing dates
test_date1 = datetime.datetime(1997, 1, 4)
test_date2 = datetime.datetime(1997, 1, 30)
               
# printing original dates
print("The original date 1 is : " + str(test_date1))
print("The original date 2 is : " + str(test_date2))
  
# initializing N
N = 7
  
temp = []
  
# getting diff.
diff = ( test_date2 - test_date1) // N
for idx in range(0, N):
      
    # computing new dates
    temp.append((test_date1 + idx * diff))
  
# using strftime to convert to userfriendly 
# format
res = []
for sub in temp:
  res.append(sub.strftime("%Y/%m/%d %H:%M:%S"))
  
# printing result
print("N equal duration dates : " + str(res))

Producción:

La fecha original 1 es: 1997-01-04 00:00:00

La fecha original 2 es: 1997-01-30 00:00:00

N fechas de igual duración: [‘1997/01/04 00:00:00’, ‘1997/01/07 17:08:34’, ‘1997/01/11 10:17:08’, ‘1997/01/ 15 03:25:42′, ’18/01/1997 20:34:17′, ’22/01/1997 13:42:51′, ’26/01/1997 06:51:25’]

Método #2: Usando la función de generador

En esto, realizamos la tarea de producir un resultado intermedio utilizando la función de generador en lugar del enfoque de bucle. La única diferencia es que se devuelve un resultado intermedio. 

Python3

# Python3 code to demonstrate working of
# Convert date range to N equal durations
# Using generator function
import datetime
  
def group_util(test_date1, test_date2, N):
      
    diff = (test_date2  - test_date1 ) / N
    for idx in range(N):
          
        # using generator function to solve problem
        # returns intermediate result
        yield (test_date1 + diff * idx)
    yield test_date2
      
# initializing dates
test_date1 = datetime.datetime(1997, 1, 4)
test_date2 = datetime.datetime(1997, 1, 30)
               
# printing original dates
print("The original date 1 is : " + str(test_date1))
print("The original date 2 is : " + str(test_date2))
  
# initializing N
N = 7
  
# calling generator expression
temp = list(group_util(test_date1, test_date2, N))
  
# using strftime to convert to userfriendly format
res = []
for sub in temp:
  res.append(sub.strftime("%Y/%m/%d %H:%M:%S"))
  
# printing result
print("N equal duration dates : " + str(res))

Producción:

La fecha original 1 es: 1997-01-04 00:00:00

La fecha original 2 es: 1997-01-30 00:00:00

N fechas de igual duración: [‘1997/01/04 00:00:00’, ‘1997/01/07 17:08:34’, ‘1997/01/11 10:17:08’, ‘1997/01/ 15 03:25:42’, ‘1997/01/18 20:34:17’, ‘1997/01/22 13:42:51’, ‘1997/01/26 06:51:25’, ‘1997/ 30/01 00:00:00’]

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 *