如何使用不带年份的datetime_range创建小时列表

时间:2019-04-17 17:59:52

标签: python datetime hour

我正在尝试创建每个指定时间间隔内包含的小时数列表,这对于循环来说会非常复杂。因此,我想提出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(祖鲁语的01st 12:00),并确保日期正确。

在我看来,环路和IF只是使事情变得复杂。更不用说错误处理了,它看起来像是两个或三个条件。

谢谢您的帮助!

2 个答案:

答案 0 :(得分:1)

对于每个有效字符串,我使用pizza_prices[2]进行解析,然后根据开始日期小于或等于结束日期,或者大于结束日期,计算小时数。

对于小于或等于结束日期的开始日期,我认为是原始有效字符串,否则我将创建两个字符串25datetime.strptime

start_date/3023

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

0100/end_date

答案 1 :(得分:0)

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

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小时(如果条件和类似的串联块可以解决一个问题),不使用日期时间,仅使用数字和字符串。它既不是pythonic的也不是快速的,但是可以工作。