如何在Python中基于起止日期构建无重叠动态间隔时间戳范围
多线程API调用参数生成问题
需求说明
- 开发多线程API调用功能,需传入起始时间戳
first和周期数。例如参数('2022-09-05 10:00:00.000000', 7)表示从10:00开始拉取7小时数据(到17:00但不包含该时间)。 - API始终会评估完整周期,即使起始时间不处于周期起点,也会取用包含该时间的完整周期数据。
- 最终需生成一组元组参数列表,无重叠且完整覆盖指定起止时间戳范围,不能有重复、重叠或多余时长。
初始实现代码
from datetime import date, datetime, timedelta def build_params(start, end, delta, num): pattern = "%Y-%m-%d %H:%M:%S.%f" start_dt = datetime.strptime(start, pattern) end_dt = datetime.strptime(end, pattern) curr = start_dt l = [] while curr <= end_dt: l.append((datetime.strftime(curr, pattern), num)) curr += delta return l
存在的问题
该函数无法正确计算列表最后一项的周期数num,未处理起止时间戳与周期数之间的边界细节。
测试用例
# 测试场景1 start = "2022-09-05 10:00:00.000000" end = "2022-09-06 16:00:00.000000" # 测试场景2 start = "2022-09-05 10:00:00.000000" end = "2022-09-06 16:59:59.999999" # 测试场景3 start = "2022-09-05 10:59:59.999999" end = "2022-09-06 16:00:00.000000" num = 7 delta = timedelta(hours=num) l = build_params(start, end, delta, num) for i in l: print(i)
尝试的改进代码(仍有错误)
from datetime import date, datetime, timedelta import math def build_params(start, end, delta, num): pattern = "%Y-%m-%d %H:%M:%S.%f" start_dt = datetime.strptime(start, pattern) end_dt = datetime.strptime(end, pattern) curr = start_dt l = [] while curr <= end_dt: future = curr + delta if future > end_dt: diff = end_dt - curr diff_hours = diff.total_seconds()/3600 num = math.ceil(diff_hours) l.append((datetime.strftime(curr, pattern), num)) curr += delta return l
期望正确输出示例
以测试场景1为例,期望输出如下:
('2022-09-05 10:00:00.000000', 7) ('2022-09-05 17:00:00.000000', 7) ('2022-09-06 00:00:00.000000', 7) ('2022-09-06 07:00:00.000000', 7) ('2022-09-06 14:00:00.000000', 3)
该逻辑需适配所有num、start和end时间戳组合。
内容的提问来源于stack exchange,提问作者cauthon
相关产品推荐
相关产品推荐

