Я хочу создать функцию, которая будет принимать start_time и end_time и которая найдет интервал времени, в который эти времена подходят. Диапазон времени должен быть каждые 5 минут, но вмененный интервал времени может быть любым другим временем.

У меня есть эти интервалы (я сделал их с помощью функции ниже):

00:00:00
00:05:00
00:10:00
00:15:00
00:20:00
00:25:00
00:30:00
00:35:00
00:40:00
00:45:00
00:50:00
00:55:00

import datetime
import pandas as pd
import time

# creating time intervals at every 5 minutes
def find_interval(start_time, end_time):
    start_time = "00:00:00"
    end_time = "0:59:59"

    start = datetime.datetime.strptime(start_time,  '%H:%M:%S')
    end = datetime.datetime.strptime(end_time, '%H:%M:%S')
    step = datetime.timedelta(minutes=5)

    time_intervals = []

    while start <= end:
        time_intervals.append(start.time())
        #print(start.time())
        start += step

    #print(time_intervals)

Что мне делать, чтобы, когда пользователь вводит start_time и end_time, например, 00:13:24 и 00:22:41, я получаю результат: { { Х4 }}

0
taga 26 Июн 2019 в 15:57

3 ответа

Лучший ответ

Попробуй это:

import datetime
import time


# creating time intervals at every 5 minutes
def create_intervals():
    start_time = "00:00:00"
    end_time = "0:59:59"

    start = datetime.datetime.strptime(start_time, '%H:%M:%S')
    end = datetime.datetime.strptime(end_time, '%H:%M:%S')
    step = datetime.timedelta(minutes=5)

    time_intervals = []

    while start <= end:
        time_intervals.append(start.time())
        # print(start.time())
        start += step
    return time_intervals


def find_intervals(start_time, end_time, intervals):
    start = datetime.datetime.strptime(start_time, '%H:%M:%S').time()
    end = datetime.datetime.strptime(end_time, '%H:%M:%S').time()

    first = next(i for i, v in enumerate(intervals) if start <= v) - 1
    last = next(i for i, v in enumerate(intervals) if end <= v) + 1

    return intervals[first:last]


intervals = create_intervals()

result = [str(i) for i in find_intervals("00:13:24", "00:22:41", intervals)]
print(result)

Я использую вашу функцию для создания списка интервалов, затем по временам ввода я нахожу первый и последний раз, когда «покрывают» времена ввода, и возвращаю их.

Чтобы распечатать его в том формате, который вы запрашивали, я приведу объект datetime.time к str.

Выход:

['00: 10: 00 ', '00: 15: 00', '00: 20: 00 ', '00: 25: 00']

2
Adam.Er8 26 Июн 2019 в 13:18

Единственное, о чем вы должны подумать - как преобразовать 00:13:41 в 00:10:00 и 00:22:41 в 00:25:00.

import pandas as pd

# this function round to previous or next 5M
def round5M(tm, PoN):
    PoN = 0 if PoN is "previous" else 1
    return "00:{:02}:00".format((int(tm[3:5])//5 + PoN) * 5)

start_time = "00:13:24"
end_time = "00:22:41"

out = pd.timedelta_range(start=round5M(start_time, "previous"),
                         end=round5M(end_time, "next"),
                         freq="5T")\
        .astype(str)\
        .to_list()


print(out)
['00:10:00', '00:15:00', '00:20:00', '00:25:00']
1
rpanai 26 Июн 2019 в 13:38

Совершенно другой подход, основанный на ответе @ rpanai и pd.date_range:

import pandas as pd
import datetime

intervals = pd.date_range('00:00', '01:00:00', freq='5min').time

start_time, end_time = "00:13:24", "00:22:41"
start = (datetime.datetime.strptime(start_time, '%H:%M:%S') - datetime.timedelta(minutes=5)).time()
end = (datetime.datetime.strptime(end_time, '%H:%M:%S') + datetime.timedelta(minutes=5)).time()

print(intervals[(intervals >= start) & (intervals <= end)].astype(str))

Выход:

['00: 10: 00 ''00: 15: 00' '00: 20: 00 ''00: 25: 00']

0
Adam.Er8 26 Июн 2019 в 13:42