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

标签 python datetime hour

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

# 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']

关于python - 如何使用不带年份的 datetime_range 创建每小时列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55733502/

相关文章:

python - Pandas系列在Python中按月份索引排序(时间序列不同)

r - 如何在 R 中求和或平均小时数

python - 如何使用 Facebook Prophet 选择初始、期间、范围和截止值?

python - matplotlib rc colorcycle参数与散点图

python - 为什么 pip 在我当前的 virtualenv 之外安装 python 包?

iterator - Python 中的可迭代性

javascript - 从毫秒计算周数、天数和小时数

python - 装饰器更改返回类型时键入函数

C# DateTime解析问题

过去一小时的 MongoDB 日期范围查询