Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.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 如何创建datetime_范围不含年份的小时列表_Python_Datetime_Hour - Fatal编程技术网

Python 如何创建datetime_范围不含年份的小时列表

Python 如何创建datetime_范围不含年份的小时列表,python,datetime,hour,Python,Datetime,Hour,我试图创建包含在每个指定时间间隔内的小时列表,这对于循环来说相当复杂。因此,我想请求datetime推荐 #以DDHH/DDHH格式输入: 有效期=['2712/2812'、'2723/2805'、'2800/2812'] #需求产出: val_小时数=['2712','2713','2714','2717','2723','2800','2804',] 如果有效期的最后一个小时被视为无效,那就太好了,因为该时间间隔是在该小时结束的,或者更准确地说是在前一个小时的第59分钟结束的 我尝试过使用

我试图创建包含在每个指定时间间隔内的小时列表,这对于循环来说相当复杂。因此,我想请求
datetime
推荐

#以DDHH/DDHH格式输入:
有效期=['2712/2812'、'2723/2805'、'2800/2812']
#需求产出:
val_小时数=['2712','2713','2714','2717','2723','2800','2804',]
如果有效期的最后一个小时被视为无效,那就太好了,因为该时间间隔是在该小时结束的,或者更准确地说是在前一个小时的第59分钟结束的

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

有点像:

#以DDHH/DDHH格式输入:
有效期=['2712/2812'、'2723/2805'、'2800/2812']
输出=[]
#upbound=定义每组长度列表的先前定义的函数
向上=[24,6,12]
#仅适用于前24小时组:
对于范围(0,向上[0])内的小时:
项目=整数(有效期[0][-7:-5])+小时
如果(小时>=24):
小时=小时-24
输出=输出+小时
此外,我还必须在数字前面加上日期小于10的前缀,比如112(01st12:00zulu)加上零,并确保日期正确

循环和如果在我看来似乎很复杂。不提错误处理,它看起来像两个或三个条件


谢谢你的帮助

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

开始日期小于或等于结束日期,我考虑原始有效字符串,否则我创建两个字符串<代码> StisturDATE/3023 和<代码> 0100 / EndoDeDAT< <代码> < /P>

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))

最后,我创造了这样简单的东西:

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)
validity=['3012/0112'、'3023/0105'、'0110/0112']
向上=[24,6,12]
小时数列表=[]
对于idx,枚举中的val(有效期):
小时数_li=[]
DD=val[:2]
HH=val[2:4]
dd=val[5:7]
hh=val[7:9]
如果DD==DD:
对于范围内的i(int(HH),上行[idx]):
小时数附加(DD+str(i).zfill(2))
如果DD-DD:
对于范围内的i(int(HH),24):
小时数附加(DD+str(i).zfill(2))
对于范围(0,int(hh))内的j:
小时数附加(dd+str(j).zfill(2))
小时数列表。追加(小时数)

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

到目前为止您尝试了什么?我尝试了使用datetime,检查我的答案是否有意义!很高兴能为您提供帮助:)请接受并更新我的答案,如果它对您有帮助:)我只是在调整我的程序,您建议的程序不尊重例如3021/0105这样的日期,这表明存在问题。我尝试了一些if条件实现,但它产生了更多的问题。你有一些pyhtonic和优雅的想法吗?有效期不超过30小时,因此3012/0112或3123/0205最长。我将研究它并在我的答案中相应地更新代码,感谢您让我知道
3021/0105
的预期输出,如果您能给我,我可以相应地更新我的代码!可以代码已经更新,我不再需要
upbound
查看@DavidSládek和输出,让我知道您是否清楚解决方案
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)