#python #pandas #dataframe #loops #datetime
Вопрос:
Следующий код дает мне 90-минутные временные блоки для заданного времени начала и окончания. Если мы увидим первую строку, то 90-минутный временной блок начинается 11/07/2021 04:52
и заканчивается 11/07/2021 06:22
. Однако он также может начинаться с 11/07/2021 04:53
и заканчиваться на 11/07/2021 06:23
. Кроме того, начните с 11/07/2021 04:54
и закончите на 11/07/2021 06:24
. Максимальное значение времени начала может быть разностью времени окончания и интервала (т. е. end - interval
). Это также означает, что время окончания не может превышать значение, сохраненное в объекте end
в приведенном ниже коде, и приведенный ниже код гарантирует это.
Итак, как мы можем увеличить время начала на 1 минуту, пока оно не достигнет своего максимального значения?
from datetime import datetime, timedelta def datetime_range(start, end, delta): current = start while current lt; end: yield current current = delta start = datetime(2021,7,11,4,52,0) end = start pd.Timedelta(minutes=1198) interval = timedelta(minutes=90) ts = [dt.strftime('%d/%m/%Y %H:%M') for dt in datetime_range(start, end, interval)] print(dts) task = pd.DataFrame(columns=['ST','ET']) def splitIntoBlocks(dts): for i in range(len(dts)-1): task.loc[i, ['ST']]=dts[i] task.loc[i, ['ET']]=dts[i 1] task['alpha'] = (pd.to_datetime(task['ST'], format="%d/%m/%Y %H:%M")-pd.to_datetime(start, format="%d/%m/%Y %H:%M"))/timedelta(minutes=1) task['MID'] = 1 splitIntoBlocks(dts) print(task.head(40))
Выход
['11/07/2021 04:52', '11/07/2021 06:22', '11/07/2021 07:52', '11/07/2021 09:22', '11/07/2021 10:52', '11/07/2021 12:22', '11/07/2021 13:52', '11/07/2021 15:22', '11/07/2021 16:52', '11/07/2021 18:22', '11/07/2021 19:52', '11/07/2021 21:22', '11/07/2021 22:52', '12/07/2021 00:22'] ST ET alpha MID 0 11/07/2021 04:52 11/07/2021 06:22 0.0 1 1 11/07/2021 06:22 11/07/2021 07:52 90.0 1 2 11/07/2021 07:52 11/07/2021 09:22 180.0 1 3 11/07/2021 09:22 11/07/2021 10:52 270.0 1 4 11/07/2021 10:52 11/07/2021 12:22 360.0 1 5 11/07/2021 12:22 11/07/2021 13:52 450.0 1 6 11/07/2021 13:52 11/07/2021 15:22 540.0 1 7 11/07/2021 15:22 11/07/2021 16:52 630.0 1 8 11/07/2021 16:52 11/07/2021 18:22 720.0 1 9 11/07/2021 18:22 11/07/2021 19:52 810.0 1 10 11/07/2021 19:52 11/07/2021 21:22 900.0 1 11 11/07/2021 21:22 11/07/2021 22:52 990.0 1 12 11/07/2021 22:52 12/07/2021 00:22 1080.0 1
Ответ №1:
Выполнение того, что вы просите, вообще не требует вашего dts
массива.
import pandas as pd from datetime import datetime, timedelta start = datetime(2021,7,11,4,52,0) end = start pd.Timedelta(minutes=1198) interval = timedelta(minutes=90) task = pd.DataFrame(columns=['ST','ET']) def splitIntoBlocks(now): for i in range(1198): task.loc[i, ['ST']]=now task.loc[i, ['ET']]=now interval task['alpha'] = (task['ST'] - start)/timedelta(minutes=1) task['MID'] = 1 now = timedelta(minutes=1) splitIntoBlocks(start) print(task.head(40))
Выход:
ST ET alpha MID 0 2021-07-11 04:52:00 2021-07-11 06:22:00 0.0 1 1 2021-07-11 04:53:00 2021-07-11 06:23:00 1.0 1 2 2021-07-11 04:54:00 2021-07-11 06:24:00 2.0 1 3 2021-07-11 04:55:00 2021-07-11 06:25:00 3.0 1 4 2021-07-11 04:56:00 2021-07-11 06:26:00 4.0 1 5 2021-07-11 04:57:00 2021-07-11 06:27:00 5.0 1 6 2021-07-11 04:58:00 2021-07-11 06:28:00 6.0 1 7 2021-07-11 04:59:00 2021-07-11 06:29:00 7.0 1 8 2021-07-11 05:00:00 2021-07-11 06:30:00 8.0 1 9 2021-07-11 05:01:00 2021-07-11 06:31:00 9.0 1 10 2021-07-11 05:02:00 2021-07-11 06:32:00 10.0 1 11 2021-07-11 05:03:00 2021-07-11 06:33:00 11.0 1 12 2021-07-11 05:04:00 2021-07-11 06:34:00 12.0 1 ...
Комментарии:
1. Привет. Учитывая, что время окончания, сохраненное в «конце», составляет 12/07/2021 00:50, что составляет 1198 минут время начала, сохраненное в «начале», которое составляет 11/07/2021 04:52. Но ET принимает максимальное значение 2021-07-12 02:19:00. Где это может занять максимум 12/07/2021 00:50
2. Таким образом, вы делаете диапазон 1198-90.