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)