如何创建 datetime_range 没有年份的每小时列表

How to create hourly list with datetime_range without year

我正在尝试创建包含在每个指定时间间隔内的小时列表,这对于循环来说会非常复杂。因此,我想征求datetime建议。

# input in format DDHH/ddhh:
validity = ['2712/2812','2723/2805','2800/2812']
# demanded output:
val_hours = ['2712', '2713', '2714'..., '2717', '2723', '2800',...'2804',]

如果最后一小时的有效期被视为无效,那就太好了,因为间隔在那个小时结束,或者更准确地说,在前一小时的第 59 分钟结束。

我已经尝试过使用 if 条件和循环的非常复杂的方法,但我相信还有更好的方法 - 一如既往。

类似于:

#input in format DDHH/ddhh:
validity = ['2712/2812','2723/2805','2800/2812']
output = []
#upbound = previsously defined function defining list of lengt of each group 
upbound = [24, 6, 12] 

#For only first 24-hour group:

for hour in range(0,upbound[0]):
      item = int(validity[0][-7:-5]) + hour
      if (hour >= 24):
           hour = hour - 24
   output = output + hour 

此外,我必须在日期小于 10 的数字前加上前缀,例如 112(第 01 12:00 祖鲁),并确保日期正确。

循环和 IF 在我看来只是太复杂了。不说错误处理,好像是两三个条件。

感谢您的帮助!

对于每个有效字符串,我使用 datetime.strptime 来解析它,然后根据开始日期小于或等于结束日期或大于结束日期来计算小时数。

对于小于或等于结束日期的开始日期,我认为原始有效字符串,否则我创建两个字符串 start_date/30230100/end_date

import datetime

validity = ['2712/2812','2723/2805','2800/2812','3012/0112','3023/0105','0110/0112']

def get_valid_hours(valid):

    hours_li = []
    #Parse the start date and end date as datetime
    start_date_str, end_date_str = valid.split('/')
    start_date = datetime.datetime.strptime(start_date_str,'%d%H')
    end_date = datetime.datetime.strptime(end_date_str, '%d%H')

    #If start date less than equal to end date
    if start_date <= end_date:
        dt = start_date
        i=0
        #Keep creating new dates until we hit end date
        while dt < end_date:
            #Append the dates to a list
            dt = start_date+datetime.timedelta(hours=i)
            hours_li.append(dt.strftime('%d%H'))
            i+=1
    #Else split the validity into two and calculate them separately
    else:
        start_date_str, end_date_str = valid.split('/')
        return get_valid_hours('{}/3023'.format(start_date_str)) + get_valid_hours('0100/{}'.format(end_date_str))

    #Append sublist to a bigger list
    return hours_li

for valid in validity:
    print(get_valid_hours(valid))

输出看起来像这样,不确定这是否是需要的格式!

['2712', '2713', '2714', '2715', '2716', '2717', '2718', '2719', '2720', '2721', '2722', '2723', '2800', '2801', '2802', '2803', '2804', '2805', '2806', '2807', '2808', '2809', '2810', '2811', '2812']
['2723', '2800', '2801', '2802', '2803', '2804', '2805']
['2800', '2801', '2802', '2803', '2804', '2805', '2806', '2807', '2808', '2809', '2810', '2811', '2812']
['3012', '3013', '3014', '3015', '3016', '3017', '3018', '3019', '3020', '3021', '3022', '3023', '0100', '0101', '0102', '0103', '0104', '0105', '0106', '0107', '0108', '0109', '0110', '0111', '0112']
['0100', '0101', '0102', '0103', '0104', '0105']
['0110', '0111', '0112']

最后,我创建了一个像这样简单的东西:

validity = ['3012/0112','3023/0105','0110/0112']
upbound = [24, 6, 12]

hours_list = []
for idx, val in enumerate(validity):
    hours_li = []
    DD = val[:2]
    HH = val[2:4]
    dd = val[5:7]
    hh = val[7:9]
    if DD == dd:
       for i in range(int(HH),upbound[idx]):
           hours_li.append(DD + str(i).zfill(2))
    if DD <> dd:
        for i in range(int(HH),24):
           hours_li.append(DD + str(i).zfill(2))
        for j in range(0,int(hh)):
            hours_li.append(dd + str(j).zfill(2))
    hours_list.append(hours_li)

这适用于 24 小时有效期(可以通过一个 if 条件和类似的连接块来解决),不使用日期时间,仅使用 numberst 和 str。它既不是 pythonic 也不是很快,但有效。