You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于小时位置与起止日期生成日期时间区间?

完整解决方案:从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:17:47