我正在尝试创建每个指定间隔内包含的小时列表,这对于循环来说会非常复杂。因此,我想请求日期时间
建议。
# 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/3023
和 0100/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/