如何基于小时位置与起止日期生成日期时间区间?
完整解决方案:从XML提取时间位置并生成日期时间区间
问题说明
需要从XML文件中提取start_date、end_date以及小时位置参数,生成对应的小时区间和日期时间区间。已知示例参数:
Start_date = 2023-01-01 End_date = 2024-01-01 Pos1 = 1 (hour) Pos2 = 2232 Pos3 = 2424 Pos4 = 6432 Pos5 = 6624
期望生成的小时区间:
1h - 2232h 2233h - 2424h 2425h - 6432h 6433h - 6624h 6625h - 8760h
转换后的日期时间区间:
01.01.2023 00:00 - 03.04.2023 00:00 04.04.2023 00:00 - 11.04.2023 00:00 12.04.2023 00:00 - 25.09.2023 00:00 26.09.2023 00:00 - 03.10.2023 00:00 04.10.2023 00:00 - 01.01.2024 00:00
用户已实现部分代码获取date_from,但不知道如何计算date_to,初始代码如下:
import datetime, timedelta time_interval = ['2023-01-01T00:00Z','2024-01-01T00:00Z'] for per in xml_file.findall('Period'): for intv in per.findall('Interval'): pos = int(intv.get('v')) # 提取到的五个小时位置参数 date_from = (datetime.fromisoformat(time_interval[0]) + timedelta(hours=pos)).strftime('%d.%m.%Y %H:%M')
完整解决方案
步骤1:整理小时位置并生成区间
先将提取到的小时位置存入列表,再通过end_date与start_date的差值计算总小时数,最后遍历生成连续的小时区间。
步骤2:计算每个区间的日期时间
- 区间起始时间:
start_date加上(起始小时数 - 1)小时(第1小时对应初始时间) - 区间结束时间:
start_date加上结束小时数小时
完整代码实现
import datetime from datetime import timedelta # 1. 从XML提取参数(实际代码保留原有XML解析逻辑) start_date_str = "2023-01-01T00:00Z" end_date_str = "2024-01-01T00:00Z" pos_list = [] # 解析XML获取小时位置 for per in xml_file.findall('Period'): for intv in per.findall('Interval'): pos = int(intv.get('v')) pos_list.append(pos) # 2. 计算时间跨度总小时数 start_date = datetime.datetime.fromisoformat(start_date_str) end_date = datetime.datetime.fromisoformat(end_date_str) total_hours = int((end_date - start_date).total_seconds() // 3600) # 3. 生成小时区间 hour_intervals = [] # 第一个区间 hour_intervals.append((1, pos_list[0])) # 中间区间 for i in range(len(pos_list)-1): start_hour = pos_list[i] + 1 end_hour = pos_list[i+1] hour_intervals.append((start_hour, end_hour)) # 最后一个区间 hour_intervals.append((pos_list[-1] + 1, total_hours)) # 4. 转换为日期时间区间并输出 print("小时区间:") for start_h, end_h in hour_intervals: print(f"{start_h}h{' ' if start_h < 10 else ' '} - {end_h}h") print("\n日期时间区间:") date_format = "%d.%m.%Y %H:%M" for start_h, end_h in hour_intervals: date_from = (start_date + timedelta(hours=start_h - 1)).strftime(date_format) date_to = (start_date + timedelta(hours=end_h)).strftime(date_format) print(f"{date_from} - {date_to}")
代码说明
- XML解析部分:保留原有遍历逻辑,将提取的
pos值存入pos_list即可 - 总小时数计算:通过日期差值自动计算,避免手动计算年份天数的误差
- 区间生成:自动处理首尾和中间所有区间,无需手动编写每个区间规则
- 日期时间计算:严格按照小时位置映射到对应时间,确保与示例输出一致
内容的提问来源于stack exchange,提问作者BB-9
相关产品推荐
相关产品推荐

