Generando una matriz de intervalos de 15 minutos en Python

Soy nuevo en Python. Estoy tratando de generar matriz de intervalo de tiempo. por ejemplo: time_array = ["2016-09-02T17:30:00Z", "2016-09-02T17:45:00Z", "2016-09-02T18:00:00Z", "2016-09-02T18:15:00Z", "2016-09-02T18:30:00Z", "2016-09-02T18:45:00Z"] 1. Debe crear el elemento como el de arriba en tiempo en zulú hasta las 9 pm todos los días. 2. Debería generar los elementos para el siguiente y el día siguiente también. 3. Hora de inicio de 7:00 a.m. – Hora de edición a las 9:00 p. M. y luego generar para el día siguiente y el día + 2. Y el intervalo debe ser 7:00, 7:15 así … no en 7:12, 8:32

Aquí hay un datetime_range genérico para que uses.

Código

 from datetime import datetime, timedelta def datetime_range(start, end, delta): current = start while current < end: yield current current += delta dts = [dt.strftime('%Y-%m-%d T%H:%M Z') for dt in datetime_range(datetime(2016, 9, 1, 7), datetime(2016, 9, 1, 9+12), timedelta(minutes=15))] print(dts) 

Salida

['2016-09-01 T07: 00 Z', '2016-09-01 T07: 15 Z', '2016-09-01 T07: 30 Z', '2016-09-01 T07: 45 Z', ' 2016-09-01 T08: 00 Z ',' 2016-09-01 T08: 15 Z ',' 2016-09-01 T08: 30 Z ',' 2016-09-01 T08: 45 Z ',' 2016- 09-01 T09: 00 Z ',' 2016-09-01 T09: 15 Z ',' 2016-09-01 T09: 30 Z ',' 2016-09-01 T09: 45 Z '...]

Al mirar el archivo de datos, debe usar los objetos de fecha y hora de Python integrados. seguido de strftime para formatear sus fechas.

En términos generales, puede modificar el código a continuación, independientemente de la cantidad de fechas y horarios que desee. Primero cree una fecha de inicio.

 Today= datetime.datetime.today() 

Reemplace 100 con cualquier número de intervalos de tiempo que desee.

 date_list = [Today + datetime.timedelta(minutes=15*x) for x in range(0, 100)] 

Finalmente, formatee la lista de la forma que desee, utilizando el código como el siguiente.

 datetext=[x.strftime('%Y-%m-%d T%H:%M Z') for x in date_list] 

Proporcionaré una solución que no maneja las zonas horarias, ya que el problema es generar fechas y horas, y luego puede configurar la zona horaria como lo desee.

Tiene una fecha de inicio y una hora de inicio y finalización (para cada día), más un intervalo (en minutos) para estos tiempos de datos. La idea es crear un objeto timedelta que represente el intervalo de tiempo y actualizar repetidamente la fecha y hora hasta que lleguemos a la hora de finalización, luego avanzamos un día, restablecemos la hora a la inicial y la repetimos.

Una implementación simple podría ser:

 def make_dates(start_date, number_of_days, start_time, end_time, interval, timezone): if isinstance(start_date, datetime.datetime): start_date = start_date.date() start_date = datetime.datetime.combine(start_date, start_time) cur_date = start_date num_days_passed = 0 step = datetime.timedelta(seconds=interval*60) while True: new_date = cur_date + step if new_date.time() > end_time: num_days_passed += 1 if num_days_passed > number_of_days: break new_date = start_date + datetime.timedelta(days=num_days_passed) ret_date, cur_date = cur_date, new_date yield ret_date In [31]: generator = make_dates(datetime.datetime.now(), 3, datetime.time(hour=17), datetime.time(hour=19), 15, None) In [32]: next(generator) Out[32]: datetime.datetime(2016, 9, 2, 17, 0) In [33]: next(generator) Out[33]: datetime.datetime(2016, 9, 2, 17, 15) In [34]: list(generator) Out[34]: [datetime.datetime(2016, 9, 2, 17, 30), datetime.datetime(2016, 9, 2, 17, 45), datetime.datetime(2016, 9, 2, 18, 0), datetime.datetime(2016, 9, 2, 18, 15), datetime.datetime(2016, 9, 2, 18, 30), datetime.datetime(2016, 9, 2, 18, 45), datetime.datetime(2016, 9, 2, 19, 0), datetime.datetime(2016, 9, 3, 17, 0), datetime.datetime(2016, 9, 3, 17, 15), datetime.datetime(2016, 9, 3, 17, 30), datetime.datetime(2016, 9, 3, 17, 45), datetime.datetime(2016, 9, 3, 18, 0), datetime.datetime(2016, 9, 3, 18, 15), datetime.datetime(2016, 9, 3, 18, 30), datetime.datetime(2016, 9, 3, 18, 45), datetime.datetime(2016, 9, 3, 19, 0), datetime.datetime(2016, 9, 4, 17, 0), datetime.datetime(2016, 9, 4, 17, 15), datetime.datetime(2016, 9, 4, 17, 30), datetime.datetime(2016, 9, 4, 17, 45), datetime.datetime(2016, 9, 4, 18, 0), datetime.datetime(2016, 9, 4, 18, 15), datetime.datetime(2016, 9, 4, 18, 30), datetime.datetime(2016, 9, 4, 18, 45), datetime.datetime(2016, 9, 4, 19, 0), datetime.datetime(2016, 9, 5, 17, 0), datetime.datetime(2016, 9, 5, 17, 15), datetime.datetime(2016, 9, 5, 17, 30), datetime.datetime(2016, 9, 5, 17, 45), datetime.datetime(2016, 9, 5, 18, 0), datetime.datetime(2016, 9, 5, 18, 15), datetime.datetime(2016, 9, 5, 18, 30), datetime.datetime(2016, 9, 5, 18, 45)] 

Una vez que tenga los tiempos de datos, puede usar el método strftime para convertirlos en cadenas.

Aquí hay un ejemplo usando una fecha arbitraria

 from datetime import datetime start = datetime(1900,1,1,0,0,0) end = datetime(1900,1,2,0,0,0) 

Ahora necesita obtener el timedelta (la diferencia entre dos fechas u horas) entre el start y el end

 seconds = (end - start).total_seconds() 

Definir el intervalo de 15 minutos.

 from datetime import timedelta step = timedelta(minutes=15) 

Iterar en el rango de segundos, con un paso delta del tiempo de 15 minutos (900 segundos) y sumrlo para start .

 array = [] for i in range(0, int(seconds), int(step.total_seconds())): array.append(start + timedelta(seconds=i)) print array [datetime.datetime(1900, 1, 1, 0, 0), datetime.datetime(1900, 1, 1, 0, 15), datetime.datetime(1900, 1, 1, 0, 30), datetime.datetime(1900, 1, 1, 0, 45), datetime.datetime(1900, 1, 1, 1, 0), ... 

Al final, puede formatear los objetos de fecha y hora para representar la cadena.

 array = [i.strftime('%Y-%m-%d %H:%M%:%S') for i in array] print array ['1900-01-01 00:00:00', '1900-01-01 00:15:00', '1900-01-01 00:30:00', '1900-01-01 00:45:00', '1900-01-01 01:00:00', ... 

Puede formatear el objeto datetime en la primera iteración. Pero puede lastimar tus ojos

 array.append((start + timedelta(seconds=i)).strftime('%Y-%m-%d %H:%M%:%S')) 

Aquí hay una solución de Pandas :

 import pandas as pd l = (pd.DataFrame(columns=['NULL'], index=pd.date_range('2016-09-02T17:30:00Z', '2016-09-04T21:00:00Z', freq='15T')) .between_time('07:00','21:00') .index.strftime('%Y-%m-%dT%H:%M:%SZ') .tolist() ) 

Salida:

 In [165]: l Out[165]: ['2016-09-02T17:30:00Z', '2016-09-02T17:45:00Z', '2016-09-02T18:00:00Z', '2016-09-02T18:15:00Z', '2016-09-02T18:30:00Z', '2016-09-02T18:45:00Z', '2016-09-02T19:00:00Z', '2016-09-02T19:15:00Z', '2016-09-02T19:30:00Z', '2016-09-02T19:45:00Z', '2016-09-02T20:00:00Z', '2016-09-02T20:15:00Z', '2016-09-02T20:30:00Z', '2016-09-02T20:45:00Z', '2016-09-02T21:00:00Z', '2016-09-03T07:00:00Z', '2016-09-03T07:15:00Z', '2016-09-03T07:30:00Z', '2016-09-03T07:45:00Z', '2016-09-03T08:00:00Z', '2016-09-03T08:15:00Z', '2016-09-03T08:30:00Z', '2016-09-03T08:45:00Z', '2016-09-03T09:00:00Z', '2016-09-03T09:15:00Z', '2016-09-03T09:30:00Z', '2016-09-03T09:45:00Z', '2016-09-03T10:00:00Z', '2016-09-03T10:15:00Z', '2016-09-03T10:30:00Z', '2016-09-03T10:45:00Z', '2016-09-03T11:00:00Z', '2016-09-03T11:15:00Z', '2016-09-03T11:30:00Z', '2016-09-03T11:45:00Z', '2016-09-03T12:00:00Z', '2016-09-03T12:15:00Z', '2016-09-03T12:30:00Z', '2016-09-03T12:45:00Z', '2016-09-03T13:00:00Z', '2016-09-03T13:15:00Z', '2016-09-03T13:30:00Z', '2016-09-03T13:45:00Z', '2016-09-03T14:00:00Z', '2016-09-03T14:15:00Z', '2016-09-03T14:30:00Z', '2016-09-03T14:45:00Z', '2016-09-03T15:00:00Z', '2016-09-03T15:15:00Z', '2016-09-03T15:30:00Z', '2016-09-03T15:45:00Z', '2016-09-03T16:00:00Z', '2016-09-03T16:15:00Z', '2016-09-03T16:30:00Z', '2016-09-03T16:45:00Z', '2016-09-03T17:00:00Z', '2016-09-03T17:15:00Z', '2016-09-03T17:30:00Z', '2016-09-03T17:45:00Z', '2016-09-03T18:00:00Z', '2016-09-03T18:15:00Z', '2016-09-03T18:30:00Z', '2016-09-03T18:45:00Z', '2016-09-03T19:00:00Z', '2016-09-03T19:15:00Z', '2016-09-03T19:30:00Z', '2016-09-03T19:45:00Z', '2016-09-03T20:00:00Z', '2016-09-03T20:15:00Z', '2016-09-03T20:30:00Z', '2016-09-03T20:45:00Z', '2016-09-03T21:00:00Z', '2016-09-04T07:00:00Z', '2016-09-04T07:15:00Z', '2016-09-04T07:30:00Z', '2016-09-04T07:45:00Z', '2016-09-04T08:00:00Z', '2016-09-04T08:15:00Z', '2016-09-04T08:30:00Z', '2016-09-04T08:45:00Z', '2016-09-04T09:00:00Z', '2016-09-04T09:15:00Z', '2016-09-04T09:30:00Z', '2016-09-04T09:45:00Z', '2016-09-04T10:00:00Z', '2016-09-04T10:15:00Z', '2016-09-04T10:30:00Z', '2016-09-04T10:45:00Z', '2016-09-04T11:00:00Z', '2016-09-04T11:15:00Z', '2016-09-04T11:30:00Z', '2016-09-04T11:45:00Z', '2016-09-04T12:00:00Z', '2016-09-04T12:15:00Z', '2016-09-04T12:30:00Z', '2016-09-04T12:45:00Z', '2016-09-04T13:00:00Z', '2016-09-04T13:15:00Z', '2016-09-04T13:30:00Z', '2016-09-04T13:45:00Z', '2016-09-04T14:00:00Z', '2016-09-04T14:15:00Z', '2016-09-04T14:30:00Z', '2016-09-04T14:45:00Z', '2016-09-04T15:00:00Z', '2016-09-04T15:15:00Z', '2016-09-04T15:30:00Z', '2016-09-04T15:45:00Z', '2016-09-04T16:00:00Z', '2016-09-04T16:15:00Z', '2016-09-04T16:30:00Z', '2016-09-04T16:45:00Z', '2016-09-04T17:00:00Z', '2016-09-04T17:15:00Z', '2016-09-04T17:30:00Z', '2016-09-04T17:45:00Z', '2016-09-04T18:00:00Z', '2016-09-04T18:15:00Z', '2016-09-04T18:30:00Z', '2016-09-04T18:45:00Z', '2016-09-04T19:00:00Z', '2016-09-04T19:15:00Z', '2016-09-04T19:30:00Z', '2016-09-04T19:45:00Z', '2016-09-04T20:00:00Z', '2016-09-04T20:15:00Z', '2016-09-04T20:30:00Z', '2016-09-04T20:45:00Z', '2016-09-04T21:00:00Z'] 

Este es el guión final que he escrito en base a las respuestas publicadas en mi pregunta:

 from datetime import datetime from datetime import timedelta import calendar current_utc = datetime.utcnow().strftime("%Y-%m-%d-%H-%M-%S") current_year = int(current_utc.split("-")[0]) current_month = int(current_utc.split("-")[1]) current_date = int(current_utc.split("-")[2]) current_hour = int(current_utc.split("-")[3]) current_min = int(current_utc.split("-")[4]) current_sec = int(current_utc.split("-")[5]) #### To make minutes round to quarter #### min_range_1 = range(1,16) min_range_2 = range(16,31) min_range_3 = range(31,46) min_range_4 = range(46,60) if current_min in min_range_1: current_min = 15 elif current_min in min_range_2: current_min = 30 elif current_min in min_range_3: current_min = 45 elif current_min in min_range_4: current_hour = current_hour + 1 current_min = 0 else: print("Please check current minute.") current_sec = 00 date_range_31 = range(1,32) date_range_30 = range(1,31) month_days_31 = [1,3,5,7,8,10,12] month_days_30 = [4,6,9,11] if current_month in month_days_31: if current_date == 31: next_day_month = current_month + 1 next_day_date = 1 else: next_day_month = current_month next_day_date = current_date elif current_month == 2: if calendar.isleap(current_year): if current_date == 29: next_day_month = current_month + 1 next_day_date = 1 else: next_day_month = current_month next_day_date = current_date else: if current_date == 28: next_day_month = current_month + 1 next_day_date = 1 else: next_day_month = current_month next_day_date = current_date elif current_month in month_days_30: if current_date == 30: next_day_month = current_month + 1 next_day_date = 1 else: next_day_month = current_month next_day_date = current_date else: print("Please check the current month and date to procedd further.") if current_hour < 11: current_hour = 11 current_min = 15 next_day_date = current_date + 1 current_start = datetime(current_year,current_month,current_date,current_hour,current_min,current_sec) current_end = datetime(current_year,current_month,current_date,21,15,0) next_day_start = datetime(current_year,next_day_month,next_day_date,11,15,0) next_day_end = datetime(current_year,next_day_month,next_day_date,21,15,0) current_seconds = (current_end - current_start).total_seconds() next_day_seconds = (next_day_end - next_day_start).total_seconds() step = timedelta(minutes=15) current_day_array = [] next_day_array = [] for i in range(0, int(current_seconds), int(step.total_seconds())): current_day_array.append(current_start + timedelta(seconds=i)) for i in range(0, int(next_day_seconds), int(step.total_seconds())): current_day_array.append(next_day_start + timedelta(seconds=i)) current_day_array = [i.strftime('%Y-%m-%dT%H:%M%:%SZ') for i in current_day_array] print current_day_array 

Que produce el siguiente resultado:

 ['2016-09-03T11:15:00Z', '2016-09-03T11:30:00Z', '2016-09-03T11:45:00Z', '2016-09-03T12:00:00Z', '2016-09-03T12:15:00Z', '2016-09-03T12:30:00Z', '2016-09-03T12:45:00Z', '2016-09-03T13:00:00Z', '2016-09-03T13:15:00Z', '2016-09-03T13:30:00Z', '2016-09-03T13:45:00Z', '2016-09-03T14:00:00Z', '2016-09-03T14:15:00Z', '2016-09-03T14:30:00Z', '2016-09-03T14:45:00Z', '2016-09-03T15:00:00Z', '2016-09-03T15:15:00Z', '2016-09-03T15:30:00Z', '2016-09-03T15:45:00Z', '2016-09-03T16:00:00Z', '2016-09-03T16:15:00Z', '2016-09-03T16:30:00Z', '2016-09-03T16:45:00Z', '2016-09-03T17:00:00Z', '2016-09-03T17:15:00Z', '2016-09-03T17:30:00Z', '2016-09-03T17:45:00Z', '2016-09-03T18:00:00Z', '2016-09-03T18:15:00Z', '2016-09-03T18:30:00Z', '2016-09-03T18:45:00Z', '2016-09-03T19:00:00Z', '2016-09-03T19:15:00Z', '2016-09-03T19:30:00Z', '2016-09-03T19:45:00Z', '2016-09-03T20:00:00Z', '2016-09-03T20:15:00Z', '2016-09-03T20:30:00Z', '2016-09-03T20:45:00Z', '2016-09-03T21:00:00Z', '2016-09-04T11:15:00Z', '2016-09-04T11:30:00Z', '2016-09-04T11:45:00Z', '2016-09-04T12:00:00Z', '2016-09-04T12:15:00Z', '2016-09-04T12:30:00Z', '2016-09-04T12:45:00Z', '2016-09-04T13:00:00Z', '2016-09-04T13:15:00Z', '2016-09-04T13:30:00Z', '2016-09-04T13:45:00Z', '2016-09-04T14:00:00Z', '2016-09-04T14:15:00Z', '2016-09-04T14:30:00Z', '2016-09-04T14:45:00Z', '2016-09-04T15:00:00Z', '2016-09-04T15:15:00Z', '2016-09-04T15:30:00Z', '2016-09-04T15:45:00Z', '2016-09-04T16:00:00Z', '2016-09-04T16:15:00Z', '2016-09-04T16:30:00Z', '2016-09-04T16:45:00Z', '2016-09-04T17:00:00Z', '2016-09-04T17:15:00Z', '2016-09-04T17:30:00Z', '2016-09-04T17:45:00Z', '2016-09-04T18:00:00Z', '2016-09-04T18:15:00Z', '2016-09-04T18:30:00Z', '2016-09-04T18:45:00Z', '2016-09-04T19:00:00Z', '2016-09-04T19:15:00Z', '2016-09-04T19:30:00Z', '2016-09-04T19:45:00Z', '2016-09-04T20:00:00Z', '2016-09-04T20:15:00Z', '2016-09-04T20:30:00Z', '2016-09-04T20:45:00Z', '2016-09-04T21:00:00Z']