Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中将一个周期分解为一组子周期(小时、四分之一小时和分钟)_Python_Algorithm_Recursion_Period - Fatal编程技术网

如何在python中将一个周期分解为一组子周期(小时、四分之一小时和分钟)

如何在python中将一个周期分解为一组子周期(小时、四分之一小时和分钟),python,algorithm,recursion,period,Python,Algorithm,Recursion,Period,我想将一个时段拆分为几个预定义大小的子时段 以下是一个例子: 在2021-04-11 15:03:00和2021-04-11 18:03:00之间,分解为小时、四分之一小时和分钟。预期结果为(无具体顺序): 我现在的代码是: def ceil_dt(dt, delta): return dt + (datetime.min - dt) % delta def floor_dt(dt, delta): return dt - (dt - datetime.min) % delta

我想将一个时段拆分为几个预定义大小的子时段

以下是一个例子:

在2021-04-11 15:03:00和2021-04-11 18:03:00之间,分解为小时、四分之一小时和分钟。预期结果为(无具体顺序):

我现在的代码是:

def ceil_dt(dt, delta):
    return dt + (datetime.min - dt) % delta

def floor_dt(dt, delta):
    return dt - (dt - datetime.min) % delta

def list_dt(start, end, subperiod, indice):
    temp = start
    min = ceil_dt(temp, timedelta(minutes=subperiod[indice]))

    print(f'\nstart {start}')
    print(f'end {end}')
    print(f'subperiod {subperiod}')
    print(f'indice {indice}')
    print(f'min {min}')

    while temp + timedelta(minutes=subperiod[indice]) <= floor_dt(end, timedelta(minutes=subperiod[indice])) :
        print(f'result {ceil_dt(temp, timedelta(minutes=subperiod[indice]))}')
        temp = temp + timedelta(minutes=subperiod[indice])
        max = ceil_dt(temp, timedelta(minutes=subperiod[indice]))

    print(f'max {max}')

    if min != start:
        print("other min")
        indice = indice + 1
        list_dt(start, min, subperiod, indice)

#     if max != end:
#         print("other max")
#         indice = indice + 1
#         list_dt(max, end, subperiod, indice)


subperiod = [60, 15, 1]
indice = 0

start = datetime(2021, 4, 11, 15, 3, 0)
end = datetime(2021, 4, 11, 18, 3, 0)
list_dt(start, end, subperiod, indice)
def ceil_dt(dt,delta):
返回dt+(datetime.min-dt)%delta
def地板_dt(dt,增量):
返回dt-(dt-datetime.min)%delta
def列表(开始、结束、子周期、指示):
温度=开始
min=ceil_dt(温度、时间增量(分钟=子周期[指标])
打印(f'\n开始{start}')
打印(f'end{end}')
打印(f'subperiod{subperiod}')
打印(f'indice{indice}')
打印(f'min{min})

当temp+timedelta(分钟=子周期[indice])时,您可以使用
while
循环:

from datetime import datetime, timedelta as td
def list_dt(d1, d2):
  while d1 < d2:
     yield d1
     if not d1.minute and d1+td(hours = 1) <= d2:
        d1 += td(hours = 1)
     elif not d1.minute%15 and d1+td(minutes = 15) <= d2:
        d1 += td(minutes = 15)
     else:
        d1 += td(minutes = 1)

for a, b in [[datetime(2021, 4, 11, 15, 3, 0), datetime(2021, 4, 11, 18, 3, 0)], [datetime(2021, 4, 11, 15, 0, 0), datetime(2021, 4, 11, 18, 0, 0)], [datetime(2021, 4, 11, 15, 15, 0), datetime(2021, 4, 11, 18, 30, 0)]]:
   for i in list_dt(a, b):
      print(str(i))
   print('-'*20)

您所描述的内容已通过datetime的提供。作为一个基本示例,您可以编写如下函数:

    import dateutil.rrule as rrule
    from datetime import datetime, timedelta
    
    # function to round to nearest n time
    def round_nearest(date, **kwargs):
        secs = timedelta(**kwargs).total_seconds()
        return datetime.fromtimestamp(date.timestamp() + secs - date.timestamp() % secs)
    
    # function to return per OP's post
    def hours_aligned(start, end, inc = True):
        print("Minutes")
        if inc: yield start # remove if you don't require start
        rule = rrule.rrule(rrule.MINUTELY, dtstart=start)
        for x in rule.between(start, end, inc = False):
            yield x
        if inc: yield end # remove if you don't require end
    
        print("Hours")
        if inc: yield start # remove if you don't require start
        rule = rrule.rrule(rrule.HOURLY, dtstart=start)
        for x in rule.between(start, end, inc = False):
            yield x
        if inc: yield end # remove if you don't require end
    
        print("Quarter Hours")
        if inc: yield start # remove if you don't require start
        rule = rrule.rrule(rrule.MINUTELY, interval=15, dtstart=round_nearest(start, minutes=15))
        for x in rule.between(start, end, inc = False):
            yield x
        if inc: yield end # remove if you don't require end
    
    
    start = datetime(2021, 4, 11, 15, 3, 0)
    end = datetime(2021, 4, 11, 18, 3, 0)
    
    for x in hours_aligned(start, end, inc=True):
        print(x)

Minutes
2021-04-11 15:03:00
2021-04-11 15:04:00
2021-04-11 15:05:00
2021-04-11 15:06:00
2021-04-11 15:07:00
2021-04-11 15:08:00
2021-04-11 15:09:00
2021-04-11 15:10:00
2021-04-11 15:11:00
2021-04-11 15:12:00
2021-04-11 15:13:00
2021-04-11 15:14:00
2021-04-11 15:15:00
2021-04-11 15:16:00
2021-04-11 15:17:00
2021-04-11 15:18:00
2021-04-11 15:19:00
2021-04-11 15:20:00
2021-04-11 15:21:00
2021-04-11 15:22:00
2021-04-11 15:23:00
2021-04-11 15:24:00
2021-04-11 15:25:00
2021-04-11 15:26:00
2021-04-11 15:27:00
2021-04-11 15:28:00
2021-04-11 15:29:00
2021-04-11 15:30:00
2021-04-11 15:31:00
2021-04-11 15:32:00
2021-04-11 15:33:00
2021-04-11 15:34:00
2021-04-11 15:35:00
2021-04-11 15:36:00
2021-04-11 15:37:00
2021-04-11 15:38:00
2021-04-11 15:39:00
2021-04-11 15:40:00
2021-04-11 15:41:00
2021-04-11 15:42:00
2021-04-11 15:43:00
2021-04-11 15:44:00
2021-04-11 15:45:00
2021-04-11 15:46:00
2021-04-11 15:47:00
2021-04-11 15:48:00
2021-04-11 15:49:00
2021-04-11 15:50:00
2021-04-11 15:51:00
2021-04-11 15:52:00
2021-04-11 15:53:00
2021-04-11 15:54:00
2021-04-11 15:55:00
2021-04-11 15:56:00
2021-04-11 15:57:00
2021-04-11 15:58:00
2021-04-11 15:59:00
2021-04-11 16:00:00
2021-04-11 16:01:00
2021-04-11 16:02:00
2021-04-11 16:03:00
2021-04-11 16:04:00
2021-04-11 16:05:00
2021-04-11 16:06:00
2021-04-11 16:07:00
2021-04-11 16:08:00
2021-04-11 16:09:00
2021-04-11 16:10:00
2021-04-11 16:11:00
2021-04-11 16:12:00
2021-04-11 16:13:00
2021-04-11 16:14:00
2021-04-11 16:15:00
2021-04-11 16:16:00
2021-04-11 16:17:00
2021-04-11 16:18:00
2021-04-11 16:19:00
2021-04-11 16:20:00
2021-04-11 16:21:00
2021-04-11 16:22:00
2021-04-11 16:23:00
2021-04-11 16:24:00
2021-04-11 16:25:00
2021-04-11 16:26:00
2021-04-11 16:27:00
2021-04-11 16:28:00
2021-04-11 16:29:00
2021-04-11 16:30:00
2021-04-11 16:31:00
2021-04-11 16:32:00
2021-04-11 16:33:00
2021-04-11 16:34:00
2021-04-11 16:35:00
2021-04-11 16:36:00
2021-04-11 16:37:00
2021-04-11 16:38:00
2021-04-11 16:39:00
2021-04-11 16:40:00
2021-04-11 16:41:00
2021-04-11 16:42:00
2021-04-11 16:43:00
2021-04-11 16:44:00
2021-04-11 16:45:00
2021-04-11 16:46:00
2021-04-11 16:47:00
2021-04-11 16:48:00
2021-04-11 16:49:00
2021-04-11 16:50:00
2021-04-11 16:51:00
2021-04-11 16:52:00
2021-04-11 16:53:00
2021-04-11 16:54:00
2021-04-11 16:55:00
2021-04-11 16:56:00
2021-04-11 16:57:00
2021-04-11 16:58:00
2021-04-11 16:59:00
2021-04-11 17:00:00
2021-04-11 17:01:00
2021-04-11 17:02:00
2021-04-11 17:03:00
2021-04-11 17:04:00
2021-04-11 17:05:00
2021-04-11 17:06:00
2021-04-11 17:07:00
2021-04-11 17:08:00
2021-04-11 17:09:00
2021-04-11 17:10:00
2021-04-11 17:11:00
2021-04-11 17:12:00
2021-04-11 17:13:00
2021-04-11 17:14:00
2021-04-11 17:15:00
2021-04-11 17:16:00
2021-04-11 17:17:00
2021-04-11 17:18:00
2021-04-11 17:19:00
2021-04-11 17:20:00
2021-04-11 17:21:00
2021-04-11 17:22:00
2021-04-11 17:23:00
2021-04-11 17:24:00
2021-04-11 17:25:00
2021-04-11 17:26:00
2021-04-11 17:27:00
2021-04-11 17:28:00
2021-04-11 17:29:00
2021-04-11 17:30:00
2021-04-11 17:31:00
2021-04-11 17:32:00
2021-04-11 17:33:00
2021-04-11 17:34:00
2021-04-11 17:35:00
2021-04-11 17:36:00
2021-04-11 17:37:00
2021-04-11 17:38:00
2021-04-11 17:39:00
2021-04-11 17:40:00
2021-04-11 17:41:00
2021-04-11 17:42:00
2021-04-11 17:43:00
2021-04-11 17:44:00
2021-04-11 17:45:00
2021-04-11 17:46:00
2021-04-11 17:47:00
2021-04-11 17:48:00
2021-04-11 17:49:00
2021-04-11 17:50:00
2021-04-11 17:51:00
2021-04-11 17:52:00
2021-04-11 17:53:00
2021-04-11 17:54:00
2021-04-11 17:55:00
2021-04-11 17:56:00
2021-04-11 17:57:00
2021-04-11 17:58:00
2021-04-11 17:59:00
2021-04-11 18:00:00
2021-04-11 18:01:00
2021-04-11 18:02:00
2021-04-11 18:03:00
Hours
2021-04-11 15:03:00
2021-04-11 16:03:00
2021-04-11 17:03:00
2021-04-11 18:03:00
Quarter Hours
2021-04-11 15:03:00
2021-04-11 15:15:00
2021-04-11 15:30:00
2021-04-11 15:45:00
2021-04-11 16:00:00
2021-04-11 16:15:00
2021-04-11 16:30:00
2021-04-11 16:45:00
2021-04-11 17:00:00
2021-04-11 17:15:00
2021-04-11 17:30:00
2021-04-11 17:45:00
2021-04-11 18:00:00
2021-04-11 18:03:00

我创建了3条规则,即按分钟,按分钟,但间隔15分钟,然后按小时,即每小时。Inc只是您是否希望包含起始端。

为什么是
2021-04-11 18:00:00(分钟)
而不是
小时
?因为小时不完整。时间从00:00到59:59。就我而言,我只有3分钟的时间,谢谢你的帮助。我使用的python 3.7不支持赋值表达式,目前无法切换到3.8。我还需要能够设置子时段。这不是不可能的,在未来我将增加30分钟。需要做哪些更改?@lovelace63我更新了帖子,删除了赋值表达式。如果您希望在将来添加其他时间间隔,那么您可以在第一个15分钟检查下将它们作为条件包含。如果我尝试在datetime(2021,4,11,15,3,0)和datetime(2021,4,11,18,3,0)之间进行切换,则应为15小时、16小时和17小时,你的情况不是这样的code@lovelace63这些日期时间与我的帖子中使用的日期时间相同(请参见
start
end
)。你能澄清一下吗?@lovelace63请看我最近的编辑。谢谢。我不知道。我不知道如何组合规则来获得我所需要的。请尝试我的更新功能。。如果在任何函数或某些函数上不需要开始和结束,则只需删除它们。。这只是一个例子。
2021-04-11 15:03:00
2021-04-11 15:04:00
2021-04-11 15:05:00
2021-04-11 15:06:00
2021-04-11 15:07:00
2021-04-11 15:08:00
2021-04-11 15:09:00
2021-04-11 15:10:00
2021-04-11 15:11:00
2021-04-11 15:12:00
2021-04-11 15:13:00
2021-04-11 15:14:00
2021-04-11 15:15:00
2021-04-11 15:30:00
2021-04-11 15:45:00
2021-04-11 16:00:00
2021-04-11 17:00:00
2021-04-11 18:00:00
2021-04-11 18:01:00
2021-04-11 18:02:00
--------------------
2021-04-11 15:00:00
2021-04-11 16:00:00
2021-04-11 17:00:00
--------------------
2021-04-11 15:15:00
2021-04-11 15:30:00
2021-04-11 15:45:00
2021-04-11 16:00:00
2021-04-11 17:00:00
2021-04-11 18:00:00
2021-04-11 18:15:00
--------------------
    import dateutil.rrule as rrule
    from datetime import datetime, timedelta
    
    # function to round to nearest n time
    def round_nearest(date, **kwargs):
        secs = timedelta(**kwargs).total_seconds()
        return datetime.fromtimestamp(date.timestamp() + secs - date.timestamp() % secs)
    
    # function to return per OP's post
    def hours_aligned(start, end, inc = True):
        print("Minutes")
        if inc: yield start # remove if you don't require start
        rule = rrule.rrule(rrule.MINUTELY, dtstart=start)
        for x in rule.between(start, end, inc = False):
            yield x
        if inc: yield end # remove if you don't require end
    
        print("Hours")
        if inc: yield start # remove if you don't require start
        rule = rrule.rrule(rrule.HOURLY, dtstart=start)
        for x in rule.between(start, end, inc = False):
            yield x
        if inc: yield end # remove if you don't require end
    
        print("Quarter Hours")
        if inc: yield start # remove if you don't require start
        rule = rrule.rrule(rrule.MINUTELY, interval=15, dtstart=round_nearest(start, minutes=15))
        for x in rule.between(start, end, inc = False):
            yield x
        if inc: yield end # remove if you don't require end
    
    
    start = datetime(2021, 4, 11, 15, 3, 0)
    end = datetime(2021, 4, 11, 18, 3, 0)
    
    for x in hours_aligned(start, end, inc=True):
        print(x)

Minutes
2021-04-11 15:03:00
2021-04-11 15:04:00
2021-04-11 15:05:00
2021-04-11 15:06:00
2021-04-11 15:07:00
2021-04-11 15:08:00
2021-04-11 15:09:00
2021-04-11 15:10:00
2021-04-11 15:11:00
2021-04-11 15:12:00
2021-04-11 15:13:00
2021-04-11 15:14:00
2021-04-11 15:15:00
2021-04-11 15:16:00
2021-04-11 15:17:00
2021-04-11 15:18:00
2021-04-11 15:19:00
2021-04-11 15:20:00
2021-04-11 15:21:00
2021-04-11 15:22:00
2021-04-11 15:23:00
2021-04-11 15:24:00
2021-04-11 15:25:00
2021-04-11 15:26:00
2021-04-11 15:27:00
2021-04-11 15:28:00
2021-04-11 15:29:00
2021-04-11 15:30:00
2021-04-11 15:31:00
2021-04-11 15:32:00
2021-04-11 15:33:00
2021-04-11 15:34:00
2021-04-11 15:35:00
2021-04-11 15:36:00
2021-04-11 15:37:00
2021-04-11 15:38:00
2021-04-11 15:39:00
2021-04-11 15:40:00
2021-04-11 15:41:00
2021-04-11 15:42:00
2021-04-11 15:43:00
2021-04-11 15:44:00
2021-04-11 15:45:00
2021-04-11 15:46:00
2021-04-11 15:47:00
2021-04-11 15:48:00
2021-04-11 15:49:00
2021-04-11 15:50:00
2021-04-11 15:51:00
2021-04-11 15:52:00
2021-04-11 15:53:00
2021-04-11 15:54:00
2021-04-11 15:55:00
2021-04-11 15:56:00
2021-04-11 15:57:00
2021-04-11 15:58:00
2021-04-11 15:59:00
2021-04-11 16:00:00
2021-04-11 16:01:00
2021-04-11 16:02:00
2021-04-11 16:03:00
2021-04-11 16:04:00
2021-04-11 16:05:00
2021-04-11 16:06:00
2021-04-11 16:07:00
2021-04-11 16:08:00
2021-04-11 16:09:00
2021-04-11 16:10:00
2021-04-11 16:11:00
2021-04-11 16:12:00
2021-04-11 16:13:00
2021-04-11 16:14:00
2021-04-11 16:15:00
2021-04-11 16:16:00
2021-04-11 16:17:00
2021-04-11 16:18:00
2021-04-11 16:19:00
2021-04-11 16:20:00
2021-04-11 16:21:00
2021-04-11 16:22:00
2021-04-11 16:23:00
2021-04-11 16:24:00
2021-04-11 16:25:00
2021-04-11 16:26:00
2021-04-11 16:27:00
2021-04-11 16:28:00
2021-04-11 16:29:00
2021-04-11 16:30:00
2021-04-11 16:31:00
2021-04-11 16:32:00
2021-04-11 16:33:00
2021-04-11 16:34:00
2021-04-11 16:35:00
2021-04-11 16:36:00
2021-04-11 16:37:00
2021-04-11 16:38:00
2021-04-11 16:39:00
2021-04-11 16:40:00
2021-04-11 16:41:00
2021-04-11 16:42:00
2021-04-11 16:43:00
2021-04-11 16:44:00
2021-04-11 16:45:00
2021-04-11 16:46:00
2021-04-11 16:47:00
2021-04-11 16:48:00
2021-04-11 16:49:00
2021-04-11 16:50:00
2021-04-11 16:51:00
2021-04-11 16:52:00
2021-04-11 16:53:00
2021-04-11 16:54:00
2021-04-11 16:55:00
2021-04-11 16:56:00
2021-04-11 16:57:00
2021-04-11 16:58:00
2021-04-11 16:59:00
2021-04-11 17:00:00
2021-04-11 17:01:00
2021-04-11 17:02:00
2021-04-11 17:03:00
2021-04-11 17:04:00
2021-04-11 17:05:00
2021-04-11 17:06:00
2021-04-11 17:07:00
2021-04-11 17:08:00
2021-04-11 17:09:00
2021-04-11 17:10:00
2021-04-11 17:11:00
2021-04-11 17:12:00
2021-04-11 17:13:00
2021-04-11 17:14:00
2021-04-11 17:15:00
2021-04-11 17:16:00
2021-04-11 17:17:00
2021-04-11 17:18:00
2021-04-11 17:19:00
2021-04-11 17:20:00
2021-04-11 17:21:00
2021-04-11 17:22:00
2021-04-11 17:23:00
2021-04-11 17:24:00
2021-04-11 17:25:00
2021-04-11 17:26:00
2021-04-11 17:27:00
2021-04-11 17:28:00
2021-04-11 17:29:00
2021-04-11 17:30:00
2021-04-11 17:31:00
2021-04-11 17:32:00
2021-04-11 17:33:00
2021-04-11 17:34:00
2021-04-11 17:35:00
2021-04-11 17:36:00
2021-04-11 17:37:00
2021-04-11 17:38:00
2021-04-11 17:39:00
2021-04-11 17:40:00
2021-04-11 17:41:00
2021-04-11 17:42:00
2021-04-11 17:43:00
2021-04-11 17:44:00
2021-04-11 17:45:00
2021-04-11 17:46:00
2021-04-11 17:47:00
2021-04-11 17:48:00
2021-04-11 17:49:00
2021-04-11 17:50:00
2021-04-11 17:51:00
2021-04-11 17:52:00
2021-04-11 17:53:00
2021-04-11 17:54:00
2021-04-11 17:55:00
2021-04-11 17:56:00
2021-04-11 17:57:00
2021-04-11 17:58:00
2021-04-11 17:59:00
2021-04-11 18:00:00
2021-04-11 18:01:00
2021-04-11 18:02:00
2021-04-11 18:03:00
Hours
2021-04-11 15:03:00
2021-04-11 16:03:00
2021-04-11 17:03:00
2021-04-11 18:03:00
Quarter Hours
2021-04-11 15:03:00
2021-04-11 15:15:00
2021-04-11 15:30:00
2021-04-11 15:45:00
2021-04-11 16:00:00
2021-04-11 16:15:00
2021-04-11 16:30:00
2021-04-11 16:45:00
2021-04-11 17:00:00
2021-04-11 17:15:00
2021-04-11 17:30:00
2021-04-11 17:45:00
2021-04-11 18:00:00
2021-04-11 18:03:00