Разделить временной диапазон на несколько периодов времени на основе интервала в Python

#python #python-3.x #time

#python #python-3.x #время

Вопрос:

У меня есть временной диапазон и интервал, мне нужно разделить временной диапазон на несколько периодов времени на основе значения интервала.

Например, временной диапазон составляет от 9:30 до 11:30, а интервал равен 30, выходные временные периоды должны быть в списке в виде объектов datetime

Вывод:

 [
2020-08-24 9:30 - 2020-08-24 10:00,
2020-08-24 10:00 - 2020-08-24 10:30 
2020-08-24 10:30 - 2020-08-24 11:00, 
2020-08-24 11:00 - 2020-08-24 11:30
]
  

Ответ №1:

Вы можете выполнять арифметические действия с datetime объектами, добавляя timedelta объекты.

Вероятно, вам нужно точно решить, какое поведение требуется, если интервал за период не является точным делителем общего числа, но этот пример даст окончательный короткий период в этом случае.

 import datetime

tstart = datetime.datetime(2020,8,24,9,30)
tend = datetime.datetime(2020,8,24,11,30)
interval = datetime.timedelta(minutes=30)

periods = []

period_start = tstart
while period_start < tend:
    period_end = min(period_start   interval, tend)
    periods.append((period_start, period_end))
    period_start = period_end

print(periods)
  

Это дает (с новыми строками, вставленными для удобства чтения):

 [(datetime.datetime(2020, 8, 24, 9, 30), datetime.datetime(2020, 8, 24, 10, 0)),
 (datetime.datetime(2020, 8, 24, 10, 0), datetime.datetime(2020, 8, 24, 10, 30)),
 (datetime.datetime(2020, 8, 24, 10, 30), datetime.datetime(2020, 8, 24, 11, 0)),
 (datetime.datetime(2020, 8, 24, 11, 0), datetime.datetime(2020, 8, 24, 11, 30))]
  

Для нужного вам формата вывода строки вы могли бы сделать что-то вроде этого:

 def format_time(dt):
    return dt.strftime("%Y-%m-%d %H:%M")

print(['{} - {}'.format(format_time(start), format_time(end))
       for start, end in periods])
  

чтобы дать:

 ['2020-08-24 09:30 - 2020-08-24 10:00',
 '2020-08-24 10:00 - 2020-08-24 10:30',
 '2020-08-24 10:30 - 2020-08-24 11:00',
 '2020-08-24 11:00 - 2020-08-24 11:30']
  

Комментарии:

1. вместо того, чтобы делать datetime.timedelta(0, 60) * 30 , вы также можете сделать datetime.timedelta(minutes=30)

Ответ №2:

Используя pandas.date_range

 import pandas as pd

bins = pd.date_range(start='2020-08-24 9:30', end='2020-08-24 11:30', freq='30min').astype(str)
res = [' - '.join(x) for x in zip(bins[: -1], bins[1: ])]

print(res)
  

Вывод:

 ['2020-08-24 09:30:00 - 2020-08-24 10:00:00',
 '2020-08-24 10:00:00 - 2020-08-24 10:30:00',
 '2020-08-24 10:30:00 - 2020-08-24 11:00:00',
 '2020-08-24 11:00:00 - 2020-08-24 11:30:00']